この例をファイルアップローダーに使用しています。
これで次のように機能します。ファイルをアップロードすると、ファイルが保存された後、関数(do_picture_analyse)がRを呼び出し、ヒストグラムを生成します(最も単純なバージョンでは、より複雑なバージョン2のパッケージをRにインストールする必要があります)。ヒストグラムが保存されます。問題は、50個のファイルをアップロードする場合、ファイルごとにRで2つのパッケージを個別にロードするのに時間がかかることです(after_saveコールバック)。
必要なもの:ファイルをアップロードし、ファイルを保存し、[ヒストグラム]ボタンをクリックすると、データベース内のすべてのファイルに対して関数do_picture analysisが呼び出されます(一部のファイルが既に分析されているかどうかは関係ありません)。
したがって、ボタンと関数の呼び出しの間の相互作用を行う方法を知る必要があるだけで、それ以上のことは何もありません。
私のshow.html.erb:
<script id="template-download" type="text/x-tmpl">
{% for (var i=0, file; file=o.files[i]; i++) { %}
<tr class="template-download fade">
<td></td>
<td class="name">
<a href="{%=file.url%}" download="{%=file.name%}">{%=file.name%}</a>
</td>
<td class="nam">
<a href="{%=file.url_chip_image%}" download="{%=file.name%}">{%=file.name%}</a>
</td>
<td class="size"><span>{%=o.formatFileSize(file.size)%}</span></td>
<td class="Pic">
<button class="btn btn-mini btn-info">Pic</button>
</td>
<td class="Hist">
<button class="btn btn-mini btn-primary" >Hist</button>
</td>
<td class="delete">
<button class="btn btn-mini btn-danger" data-type="{%=file.delete_type%}" data-url="{%=file.delete_url%}">
<i class="icon-trash icon-white"></i>
</button>
<input type="checkbox" name="delete" value="1">
</td>
</tr>
{% } %}
</script>
私のupload.rb:
def to_jq_upload
{
"name" => (read_attribute(:upload_file_name)).split(".").first,
"size" => read_attribute(:upload_file_size),
"url" => upload.url(:original),
"delete_url" => upload_path(self),
"delete_type" => "DELETE",
"url_chip_image"=>read_attribute(:chip_image),
}
end
after_save :do_picture_analyse
def do_picture_analyse
if read_attribute(:chip_image)==nil
require 'rinruby'
myr = RinRuby.new(echo=false)
myr.filepath=upload.path(:original)
myr.fileurl=upload.url(:original)
myr.eval <<EOF
s=read.table(filepath)
for(j in nchar(filepath):1){
if(substr(filepath,j,j)=="/"){
savepath<-substr(filepath,1,j-1)
file.name<-filepath
file.name<-substr(file.name,j+1,nchar(filepath)-4)
break
}
}
file.name1<-paste(file.name,"image.jpeg",sep="_")
savepath<-paste(savepath,file.name1,sep="/")
jpeg(filename=savepath,width=250, height=250)
hist(s$V1)
dev.off()
EOF
self.update_attributes(
:chip_image => (((myr.fileurl).split("?").first)[6..-5]+'_image.jpeg')
)
end
end
編集:
do_picture_analyseは、フォルダーをパラメーターとして受け取り、フォルダー全体に対して1回だけパッケージをロードすることにより、フォルダー内のすべてのファイルを分析できます。ファイル用のフォルダーは2つだけです(2つの異なるタイプのファイル、たとえば.txtファイルと.blablaファイルはtxt-Folderまたはblabla-Folderのいずれかに保存されます。フォルダのタイプもデータベースに保存されます。ボタンをクリックすると、2つのフォルダがdo_picture_analyseに渡され、すべてが実行されます。よろしくお願いします。