2011-10-09 18 views
0

我的超簡單Sinatra應用程序是一個筆記列表,每個筆記都有一個附加的圖像。Sinatra/Carrierwave:如何在使用現有圖像的同時更新記錄?

我已經設置了一個'put'路線,可以讓我更新筆記,但是除非我重新上傳圖像,否則我會丟失它(note.image在提交表單時設置爲'nil')。

在此先感謝您的幫助!

這是我上傳:

class MyUploader < CarrierWave::Uploader::Base 
    include CarrierWave::MimeTypes 
    process :set_content_type 
    storage :fog 
end 

這裏是我的筆記類:

class Note 
    include DataMapper::Resource 
    property :id, Serial 
    property :image, String, :auto_validation => false 
    property :content, Text, :required => true 
    property :created_at, Date 
    property :updated_at, Date 
    mount_uploader :image, MyUploader     
end 

這是我的 '把' 路線:

put '/:id' do 
    n = Note.get params[:id] 
    unless n 
     redirect '/', :error => "Can't find that note." 
    end 
    n.image = params[:image] 
    n.credit = params[:content] 
    n.date = params[:date] 
    n.updated_at = Time.now 
    if n.save 
    redirect '/', :notice => 'Note updated successfully.' 
    else 
    redirect '/', :error => 'Error updating note.' 
    end 
end 

而且這裏是我使用的形式更新說明:

<% if @note %> 
    <form action="/<%= @note.id %>" method="post" id="edit" enctype="multipart/form-data"> 
    <input type="hidden" name="_method" value="put"> 
    <p><input type="text" name="credit" value="<%=h @note.content %>"></p> 
    <p><input type="file" name="image" /></p> 
    <br><br> 
    <input type="submit"> 
    </form> 
<% else %> 
    <p>Note not found.</p> 
<% end %> 

回答

1

一個簡單的,如果檢查是你所需要的:如果params[image]是零,你跳過n.image = params[:image]

n.image = params[:image] if params[:image] 

我用類似的方法來創建自定義Rails的驗證檢查,當我與包含CarrierWave圖像ActiveRecord的型號。也許這不是一個壞主意,檢查n.image是否不爲零 - 如果它是零,我想它應該是強制上傳圖像。

相關問題