发出传递模型实例以更新操作

时间:2014-07-07 23:40:47

标签: ruby-on-rails

在我的Rails应用程序中,我试图创建一个用新信息更新模型实例属性的表单,但遇到了麻烦。

当我在编辑表单上点击提交时,会抛出以下错误:

param is missing or the value is empty: product

以下是它提供的代码段:

 # all the attributes that must be submitted for the product to be listed
 def product_params 
   params.require(:product).permit(:name, :price, :description)
 end

 end

我认为问题在于模型:产品没有从编辑表单传递到更新操作。这是以下形式:

<h1>Edit your listing</h1>
<%= form_for edit_item_path(@product), url: {action: "update"} do |f| %>
  <div><%= f.label :name %><br />
   <%= f.text_field :name, :placeholder => "Name yourself" %>
  </div>
  <div><%= f.label :price %><br />
   <%= f.number_field :price, :placeholder => "Name your price" %>
  </div><br />
  <div><%= f.label :description %><br />
   <%= f.text_area :description, :cols => "50", :rows => "10", :placeholder => "Write a few sentences about the item you're listing. Is it in good condition? Are there any accessories included?"%>
  </div>
  <br />
  <%= f.submit "Update listing" %>
 <% end %>

以下是我的products_controller中的编辑和更新操作:

def edit
 @product = Product.find(params[:id])
end

def update
  @product = Product.find(params[:id])
  respond_to do |format|
    if @product.update_attributes(product_params)
      format.html {render :action => "show"}
    else
      format.html {render :action => "edit"}
    end
  end

最后,我的产品路线

get "/products/new(.:format)" => "products#new", :as => "list_item"
post "/products/create(.:format)" => "products#create"
get "/products(.:format)" => "products#index"
get "/products/:id(.:format)" => "products#show"
get "/products/:id/edit(.:format)" => "products#edit", :as => "edit_item"
post "/products/:id/update(.:format)" => "products#update"

所以任何人都知道问题是什么?我没有将正确的信息传递给更新操作吗?如果我不是,我需要做什么呢?

2 个答案:

答案 0 :(得分:0)

<强> form_for

您遇到的问题是,您使用form_for而没有任何object

  

form_for生成适当的表单标记并生成表单生成器   知道表单所在模型的对象。输入字段是   通过调用表单生成器上定义的方法创建,这意味着   他们能够生成适当的名称和默认值   对应于模型属性,以及方便的ID,et

form_for帮助程序主要用于为您提供管理ActiveRecord个对象的方法:

<%= form_for @object do |f| %>
  ...
<% end %>

-

<强>修正

此表单块中的所有内容都必须与form_for中的对象一起使用。由于您在path helper方法中仅使用form_for,因此无法按预期工作。

你需要这样做:

<%= form_for @product, url: {action: "update"} do |f| %>

这将确保您的form_for正确填充对象。您所犯的错误基本上表示您的strong_params方法期待此结构:

params => {
   "product" => {
       "name" => ____,
       "price" => _____,
       "description" => ______
   }
}

由于您未在@product中添加form_for对象,因此您的参数哈希将没有product密钥,从而导致您的错误。修复方法是正确填充form_for元素

答案 1 :(得分:0)

替换

form_for edit_item_path(@product), url: {action: "update"}

form_for @product

类似于

form_for @product, as: :product, url: product_path(@product), method: :patch do |f|