将评论嵌套在产品中,但将评论的创建移到外部:
# routes.rb
resources :products do
resources :reviews, except: [:new, :create]
end
resources :reviews, only: [:new, :create]
然后用于new_review_path
创建新评论。
如果您希望选择是否创建附加到特定产品的评论,请删除嵌套评论的 :except 选项,并根据 product_id.present? 修改控制器操作和表单。
编辑:(针对 Zephyr 的后续问题)
在上面的示例中,我已经指定:new
and:create
只能在产品外部访问,而不能在产品内部使用:except
和:only
选项进行评论 - 如果您希望能够对评论做任何事情,请随意删除它们不管它是否嵌套。唯一需要注意的是,相同的控制器操作将处理请求,无论它是否嵌套 -reviews#index
将同时处理/reviews
和/products/1/reviews
,例如 - 所以你需要确保你的控制器正确处理. 例如,使用前置过滤器:
# users_controller.rb
before_filter :filter_by_product
def filter_by_product
@parent_product = Product.find(params[:product_id]) if params[:product_id]
@reviews = @parent_product ? @parent_product.reviews : Review.all
end
def new
@review = @reviews.build
end
...
您可能还需要根据视图是否嵌套来更改视图。例如,在您创建评论的表单中,如果它没有嵌套,您可以使用产品下拉列表,或者将其替换为隐藏字段,product_id
如果它是。