Rails CRUD参数问题

时间:2009-05-14 17:56:02

标签: ruby-on-rails parameters routes models crud

所以我的背景是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,而不是出于任何原因的对象)它被交给了。)

先谢谢你的帮助,如果有任何事情发生,请告诉我。

3 个答案:

答案 0 :(得分:5)

通过查看代码,我认为问题可能是由image_url(@image)与非RESTful image路由结合使用引起的。

您可能希望删除该行

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

来自routes.rb

该行

map.resources :images

实际上应足以公开ImagesController中的所有CRUD操作。

答案 1 :(得分:1)

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

更多的贫民窟方法,在Image.find调用之前把它放在

logger.info params[:id].class

并查看该变量中的内容。您是否有可能在操作它之前使用某种过滤器?

答案 2 :(得分:0)

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

我认为这是一种更加惯用的代码重定向方式。并且+1给了molf关于RESTful路线的建议。