-1

我有CategoriesProducts。产品有关系 belongs_to :category

在类别显示页面中,我有一个添加新产品的按钮。此按钮转到我创建新产品的页面,但我需要为新产品提供类别。

如何idcategory我所在的页面传递到新产品?因此,如果我在该类别中,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

首先,我会决定每个产品是否包含在一个类别中,或者它是否只是与一个类别相关联。它包含的提示是:

  • 您希望每个产品都有一个“父”类别。
  • 您希望每个产品始终出现在其父类别的上下文中。

当且仅当您认为是这种情况时,我很想将产品资源嵌套在类别中。

# 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 回答