使用 ajax 時的 rails/paperclip 之 params 參數...?


#1

一般正常如果沒有用 javascript/ajax 時的 file/image 時,就是在 html 會可以去拆 params[:xxx] 或…看表單怎寫

但如果是用 ajax 直接拖拉時…

參數是可能就像 params[:file] …這時就沒有辦法過 paperclip 了…

因為他這個圖不是跟著原來的 form 表單…而是直接送到 server 的 params.

他的長相大約如下…

Parameters: {"file"=>#<ActionDispatch::Http::UploadedFile:0x007fd46e92b4c8 @tempfile=#<Tempfile:/var/folders/jx/z88n8kl56l7d9_2sgk9yx8kr0000gp/T/RackMultipart20151025-2963-9epwjj.jpg>, 

@original_filename=“ishot-20151025-1431421.jpg”,
@content_type=“image/jpeg”, @headers=“Content-Disposition: form-data; name=“file”;
filename=“ishot-20151025-1431421.jpg”\r\nContent-Type: image/jpeg\r\n”>}

問題就有二個…
⑴這種純用 javascript 的拖拉的 params 怎拆存?
想法: 好像用 File.read 去讀出來再放在你要的目錄(印象中有看過,但他是貼一段讀存檔案的ruby碼?
是這樣嗎?還是有更好的方式
⑵如果這種拖拉的方式想要過 paperclip 的處理(style+資料庫+那些圖片處理的方法…),那要怎使用 paperclip 的 method 去處理 params 的圖片物件?

以上…
謝謝

==更新==

可以把參數丟到 controller#create 的 paperclip model.
在 javascript 的傳送參數要設定…(還是要學一下 js …)
不過像文章的圖文是一對多…
paperclip 的是一對一…
e.g. 文對圖是一對多…
編文章時,圖如果用 js 上傳,那時還沒有文章的id…
(即一對多的「一」(文)還沒有id,但「多」的圖已塞入)…
再用 reg 去比對塞嗎?..
嚐試中…


#2

Rails已經幫你把圖片用tempfile封裝起來了,因此Tempfile:/var/folders/jx/z88n8kl56l7d9_2sgk9yx8kr0000gp/T/RackMultipart20151025-2963-9epwjj.jpg
Tempfile:後面的就是目前檔案暫存在server的path

(1)根據你的問題一你確實可以用file.new的方式開一個新檔案之後用ruby IO把tempfile的資料寫入這個新檔案,這樣就會把圖片寫入。

(2)如果你使用 paperclip

class User < ActiveRecord::Base
  has_attached_file :avatar, styles: { medium: "300x300>", thumb: "100x100>" }, default_url: "/images/:style/missing.png"
end

根據doc說的這張user table有一個欄位是avatar,你可以直接User.create(:avatar => @tempfile),這樣就會直接封裝成paperclip的object存進去。

所以前端不管你用任何的操作方式都可以,那純粹是使用上的差別,傳入後端只要你input tag 有file後端儲存的方式有很多種處理方法。

有請jc更詳解!~


#3

…請愛用 each +

弄成 array 丟進來,然後關連即可,既然一對多,你的 DB 勢必也要一對多結構,不是嗎?不然你用 Marshal 存 array 也可以的,不過一定要寫入,否則一定都是 Tempfile

至於 Tempfile 直接只給 paperclip,直接用類似 @item.image = #<Tempfile> 即可

然後沒有 id 的問題,你可以先給一個 temp_key,上傳都用此 temp_key 指定為 flag ,然後文章存檔時把 temp_key 餵回,重新找 temp_key 的 flag 把上傳的圖檔的 resource_id 改回正確的 id 即可,很簡單的概念就是,以上