3

Rails 3.2 に製品のツリーがあり、ユーザーが新しい子製品を追加したり、製品の既存の子製品を削除したりできるように、追加/削除機能が必要です。祖先ジェムを使用してツリーを生成します。製品 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 %>

updateあなたが必要とするHTTP動詞はありませんput。Rails と HTTP-Verbs については、 こちらを参照してください。

于 2012-12-03T16:11:03.683 に答える
2

parent_id: nil/products/id へのパスを設定し、次を使用して渡すことにより、@krichard の回答と @froderiks のコメントのおかげで、最終的に機能するようになりました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 %>

f.hidden_​​field の代わりに hidden_​​field_tag を使用する場合、コントローラーで :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 に答える