3

我在 Rails 3.2 中有一个产品树,并希望有一个添加/删除功能,以便用户可以添加新的子产品或删除产品的现有子产品。我使用祖先 gem 生成树,对于 Product 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 传递到表单中,以便当您点击更新时,它会设置 parent_id: nil (没有文本字段,只是一个按钮)?

4

2 回答 2

7

尝试

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

没有 HTTP 动词update,您需要的是put. 您可以在此处阅读有关 Rails 和 HTTP-Verbs 的 信息

于 2012-12-03T16:11:03.683 回答
2

多亏了@krichard 的回答和@froderiks 的评论,我终于让它工作了,方法是将路径设置为 /products/id 并传递parent_id: nilusing 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
于 2012-12-04T14:46:45.167 回答