まず、各製品がカテゴリに含まれているのか、それとも単にカテゴリに関連付けられているのかを判断します。含まれているヒントは次のとおりです。
- 各製品には、「親」カテゴリが 1 つだけあると予想されます。
- 各製品は常にその親カテゴリのコンテキストに表示されることを期待しています。
これが当てはまると思われる場合にのみ、製品リソースをカテゴリ内にネストしたくなるでしょう。
# routes.rb
resources :categories do
resources :products
end
# products_controller.rb (SIMPLIFIED!)
class ProductController < ApplicationController
before_filter :get_category
def new
@product = @category.products.build
end
def create
@product = @category.products.build(params[:product])
if @product.save
redirect_to @product
else
render template: "new"
end
end
def get_category
@category = Category.find(params[:category_id])
end
end
これを行うと、Rails は製品が適切なカテゴリに関連付けられていることを確認します。で魔法が起こり@category.products.build
、関係に基づいて category_id が自動的に設定されます。
カテゴリと製品を単純な関連付けとして保持したい場合は、Eric Andres の回答に従ってクエリ パラメータを使用しますが、少し異なる方法で処理したいと思います。
# link:
new_product_path(category_id: @category.id) # So far, so similar.
# products_controller.rb
class ProductsController < ApplicationController
def new
@product = Product.new
@product.category_id = params[:category_id].to_i if params[:category_id]
end
end
# new.erb
<%= f.hidden_field :category_id %>
これは主に単なるスタイルの違いです。エリックの答えもうまくいきます-ビューにパラメーターなどを心配させるよりも、モデル自体に値を設定することを好みます.