0

所以我的背景是 Java Web 服务,但我正在尝试转向 ROR。

我正在使用 FlexImage 来处理图像上传和缩略图生成。我按照指南进行操作,CRUD 行为一度运行良好。但是,在某些时候,我的一个模型(图像)的 CRUD 行为被破坏了。

我得到的错误代码如下:ActiveRecord::RecordNotFound in ImagesController#show -- Couldn't find Image with ID=#<Image:0x4e2bd74>.换句话说,当我告诉 Rails 创建/更新/销毁时,它会将对象与 id 混淆。这似乎表明可能存在路由问题。我认为为图像添加部分可能是个麻烦,但回滚更改并没有解决它。

以下是图像模型控制器的新、显示和更新方法:

      # 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,而不是由于某种原因正在处理的对象。)

提前感谢您的帮助,如果有任何问题,请告诉我。

4

3 回答 3

5

通过查看代码,在我看来,问题可能是由image_url(@image)与非 RE​​STfulimage路由结合使用引起的。

您可能想要删除该行

map.image 'images/:action/:id.:format', :controller => 'images'

从你的routes.rb.

线

map.resources :images

实际上应该足以在您的ImagesController.

于 2009-05-14T18:25:18.603 回答
1

我的建议是使用 ruby​​-debug 并在 Image.find 调用之前设置一个断点。检查 params[:id] 并查看它实际上是什么。

一个更贫民区的方法,把它放在 Image.find 调用之前

logger.info params[:id].class

并查看该变量中的内容。是否有可能有某种前置过滤器在操纵它?

于 2009-05-14T18:14:14.527 回答
0

尝试

  redirect_to :action => "show", :id => @image

我认为这是编码重定向的一种更惯用的方式。并对 molf 关于 RESTful 路由的建议 +1。

于 2009-05-14T18:33:38.770 回答