-1

と がCategoriesありProductsます。製品には関係があります belongs_to :category

カテゴリ表示ページには、新しい製品を追加するボタンがあります。このボタンをクリックすると、新しい製品を作成するページに移動しますが、新しい製品にカテゴリを指定する必要があります。

id以前のページからcategory新しい製品に渡すにはどうすればよいですか? したがって、カテゴリElectronicにいる場合は、[製品を追加] をクリックすると、この製品が自動的にEletronicカテゴリに関連付けられます。

私が何を望んでいるのか理解していただけると幸いです。ありがとう

4

2 に答える 2

2

category_idリンクにを渡す必要がありますnew_product_path(category_id: @category.id)

また、製品フォームにカテゴリの ID を保存するフィールドが必要です。<%= f.hidden_field :category_id, params[:category_id] %>

于 2013-05-30T19:15:43.533 に答える
0

まず、各製品がカテゴリに含まれているのか、それとも単にカテゴリに関連付けられているのかを判断します。含まれているヒントは次のとおりです。

  • 各製品には、「親」カテゴリが 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 %>

これは主に単なるスタイルの違いです。エリックの答えもうまくいきます-ビューにパラメーターなどを心配させるよりも、モデル自体に値を設定することを好みます.

于 2013-05-30T20:15:38.687 に答える