通过Rails中的link_to更新字段
我在Rails 3.2中有一个产品树,并希望有一个添加/删除function,以便用户可以添加新的子产品或删除产品的现有子项。 我使用ancestry gem生成树,对于Product 1,它可能如下所示:
Product 1 add | remove Product 2 add | remove Product 3 add | remove
在部分_product.html.erb中,我添加了添加和删除链接,这些链接适用于添加function,但我无法使删除链接起作用:
|
我想在单击“删除”时将parent_id更新为nil,以便删除产品,但上面的link_to似乎不起作用。 我得到: 没有路由匹配[POST]“/ products / 1 / edit”路由错误。 在我的product_controller中,我有:
def update if @product.update_attributes(params[:product]) flash[:success] = "Product updated" redirect_to @product else render 'edit' end end
我究竟做错了什么?
编辑:
我尝试使用method: put
改为:
然后,当点击链接时,我得到一个No route matches [PUT] "/products/1/edit"
错误。
我现在可以使用表单更改/删除父项,而不是我想要的,但无论如何:
是否可以自动将parent_id:nil传递给表单,这样当你点击Update时,它会设置parent_id:nil(没有文本字段只是一个按钮)?
尝试
<%= link_to "Remove", update_products_path(product:{parent_id: nil}), method: :put %>
没有HTTP-Verb update
您需要的内容。 您可以在此处阅读有关Rails和HTTP-Verbs的信息
我终于得到了它的工作,感谢@krichard回答和@froderiks评论,通过设置路径到/ products / id并传递parent_id: nil
使用method: :put
:
<%= link_to "Remove", "/products/#{product.id}?product%5Bparent_id%5D=", method: :put %>
使用form_for和hidden_field( 使用按钮/链接将固定值传递给字段 )可以实现相同的效果:
<%= form_for product do |f| %> <%= f.hidden_field :parent_id, value: nil %> <%= f.submit "Remove", class: "btn" %> <% end %>
如果使用hidden_field_tag而不是f.hidden_field,则必须在控制器中拾取:parent_id(感谢@froderik):
<%= form_for product do |f| %> <%= hidden_field_tag :parent_id, nil %> <%= f.submit "Remove", class: "btn" %> <% end %>
products_controller.rb
def update @product.parent_id = params[:parent_id] ... end