在我的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"
所以任何人都知道问题是什么?我没有将正确的信息传递给更新操作吗?如果我不是,我需要做什么呢?
答案 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|