创建操作时Rails nomethod错误

时间:2013-07-09 06:03:57

标签: ruby-on-rails ruby

我有一个创建产品页面和一个添加照片页面。添加照片页面应该将照片添加到刚刚创建的产品中。

我可以添加照片页面/products/:product_id/pics(.:format),但我在提交时收到错误

  

ActiveRecord :: RecordNotFound(无法找到没有ID的产品):

照片控制器

def create
  @product = Product.find(params[:product_id])   # <--- error here
  @photo = Photo.new

  if @photo.valid?
    @photo.product_id = @product.id
    @photo.save!
    respond_to do |format|
      format.html { redirect_to product_path(@product) }
      format.json { render json: @product }
    end
  else
    redirect_to root_url, :notice => "Somehting went wrong!"
  end
 end

pics.html.haml

= form_for @photo, :html => { :multipart => true, :id => "fileupload"  } do |f|
  = f.file_field :upload

产品控制器

  def pics
    @product = Product.find(params[:product_id])
    @photo = Photo.new
    # @product.photos.build
  end

完整控制台错误

在2013-07-09 02:11:11 -0400开始发布127.0.0.1的“/ photos” 由PhotosController处理#create为JSON   参数:{“utf8”=&gt;“✓”,“authenticity_token”=&gt;“K9jWB2D0bFUB5 + KOCRKLUsuDGNLchjzCBCL1h1znOiQ =”,“photo”=&gt; {“upload”=&gt;#&gt;}} 完成404未找到1ms

ActiveRecord :: RecordNotFound(找不到没有ID的产品):   app / controllers / photos_controller.rb:15:在'create'

使用sachins解决方案的控制台

在2013-07-09 02:55:25 -0400开始发布“/ photos”127.0.0.1 由PhotosController处理#create为JSON   参数:{“utf8”=&gt;“✓”,“authenticity_token”=&gt;“5RV + GUCvNEFrw7l3 / ApqAlbK / XJP78LmDR2Hc + O0rQ0 =”,“product_id”=&gt;“125”,“photo”=&gt; {“上传“=&GT;#&GT;}}   产品负载(0.1ms)选择“产品”。* FROM“产品”WHERE“产品”。“id”=?限制1 [[“id”,“125”]] 重定向到http://google.com/ 完成302发现在4ms(ActiveRecord:0.1ms)

在2013-07-09 02:55:25 -0400开始获取127.0.0.1的“/” 由StaticPagesController#home作为JSON处理   在布局/应用程序中呈现static_pages / home.html.haml(0.1ms)   用户负载(0.3ms)SELECT“users”。* FROM“users”WHERE“users”。“auth_token”IS NULL LIMIT 1 在93ms完成200 OK(浏览次数:91.8ms | ActiveRecord:0.3ms)

5 个答案:

答案 0 :(得分:2)

在表单中使用form_for [@product, @photo]而不只是@photo。当然,请务必使用params[:product_id]找到该产品。

你需要像这样嵌套你的路线:

resources :products do
  resources :photos
end

否则您的请求中不会有params[:product_id]

答案 1 :(得分:2)

尝试表格

form_for [@product, @photo] 

答案 2 :(得分:2)

试试这个:---

照片控制器

def new
  @product = Product.find(params[:product_id])
  @photo = Photo.new 
  @photo.product_id = @product.id
end

pics.html.haml

= form_for @photo, :html => { :multipart => true, :id => "fileupload"  } do |f|
  = f.file_field :upload
  = hidden_field_tag 'product_id', @photo.product_id

答案 3 :(得分:1)

从params

访问product_id时出错

使用params[:product_id]代替params[:product][:product_id]

答案 4 :(得分:0)

Just set the hidden_field_tag in form_for
 eg:-

= hidden_field_tag 'product_id', @product.id