通过Rails中的link_to更新字段

时间:2012-12-03 16:03:17

标签: ruby-on-rails ruby ruby-on-rails-3

我在Rails 3.2中有一个产品树,并希望有一个添加/删除功能,以便用户可以添加新的子产品或删除产品的现有子项。我使用祖先gem来生成树,对于产品1,它可能如下所示:

Product 1
add | remove
    Product 2
    add | remove
        Product 3
        add | remove

在部分_product.html.erb中,我添加了添加和删除链接,这些链接适用于添加功能,但我无法使删除链接起作用:

<span><%= product.name.capitalize %></span>
<%= link_to "Add", new_product_path(parent_id: product) %> | 
<%= link_to "Remove", {parent_id: nil}, method: :update %>

我想在单击“删除”时将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代替:

<%= link_to "Remove", {parent_id: nil}, method: :put %>

然后点击链接时出现No route matches [PUT] "/products/1/edit"错误。

我现在可以使用表单更改/删除父项,而不是我想要的,但无论如何:

<%= form_for @product do |f| %>    
    <%= f.label :parent_id %>
    <%= f.text_field :parent_id %>
    <%= f.submit "Update", class: "btn" %>  
<% end %>

是否可以自动将parent_id:nil传递给表单,这样当你点击Update时,它会设置parent_id:nil(没有文本字段只是一个按钮)?

2 个答案:

答案 0 :(得分:7)

尝试

<%= link_to "Remove", update_products_path(product:{parent_id: nil}), method: :put %>

没有HTTP-Verb update您需要的是put。您可以阅读有关Rails和HTTP-Verbs的信息 here

答案 1 :(得分:2)

我终于通过@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(Passing a fixed value to a field using a button/link)可以实现相同的效果:

<%= 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