通过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