私のバックグラウンドは Java Web サービスですが、ROR に移行しようとしています。
FlexImage を使用して、画像のアップロードとサムネイルの生成を処理しています。ガイドに従ったところ、ある時点で CRUD の動作が正常に機能していました。しかし、ある時点で、モデル (イメージ) の 1 つの CRUD 動作が壊れました。
返されたエラー コードは次のとおりです。ActiveRecord::RecordNotFound in ImagesController#show -- Couldn't find Image with ID=#<Image:0x4e2bd74>.
つまり、Rails に作成/更新/破棄を指示しているときに、オブジェクトと ID を混同しています。これは、ルーティングの問題がある可能性があることを示しているようです。画像の部分的な追加が問題だったのではないかと思いましたが、変更をロールバックしても修正されませんでした。
以下は、Images モデルのコントローラーの new、show、および update メソッドです。
# images_controller.rb
# ...
def new
@image = Image.new
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @image }
end
end
# ...
def show
@image = Image.find(params[:id])
respond_to do |format|
format.jpg # show.jpg.erb
format.html # show.html.erb
format.xml { render :xml => @image }
end
end
# ...
def create
@image = Image.new(params[:image])
if @image.save
redirect_to image_url(@image)
else
flash[:notice] = 'Your image did not pass validation.'
render :action => 'new'
end
end
# ...
もちろん、show() は適切な ID を期待していることに注意してください。新しい画像をアップロードするための new.html.erb は次のとおりです。
# new.html.erb [upload image]
<h1>New image</h1>
<% form_for @image, :html => { :multipart => true } do |f| %>
<%= f.error_messages %>
<table><tr><td width="50%">
<p>
<%= f.label :filename %><br />
<%= f.text_field :filename %></p>
</td>
<td><p><b>Upload Image</b><br />
<%= f.file_field :image_file %><br />
or URL: <%= f.text_field :image_file_url %>
<%= f.hidden_field :image_file_temp %>
</td>
<td>
<b>Uploaded Image:</b><br />
<%= embedded_image_tag(@image.operate { |img| img.resize 100 }) if @image.has_image? %>
</td>
</tr>
</table>
<p>
<%= f.label :description %><br />
<%= f.text_area :description %>
</p>
<p>
<%= f.submit 'Create' %>
</p>
<% end %>
<%= link_to 'Back', images_path %>
routes.rb の関連部分は次のとおりです。
# routes.rb [excerpt]
map.resources :images
map.image 'images/:action/:id.:format', :controller => 'images'
また、新しい画像が実際にアップロードされ、リダイレクト時にエラーがスローされて表示されることに注意してください (params[:id] に有効な ID が必要であり、何らかの理由で渡されるオブジェクトではありません)。
前もってご協力いただきありがとうございます。何か気になる点がありましたらお知らせください。