我知道在嵌套资源中,你必须传递包含资源的id才能工作。
但是,我希望允许用户为产品创建评论,并在新视图中指定表单中的产品,而不是在路径中实际传入。因此,不是在产品上然后进行审核,而是会有一个主审核表单,您可以在其中选择表单中的任何产品。
我在尝试这样做时遇到错误而无法弄明白 - 解决方案是什么?
#error
No route matches {:action=>"new", :controller=>"reviews"}
#view
new_product_review_path
#controller
def new
#@product = Product.new
@review = Review.new
end
#routes.rb
resources :products do
resources :reviews
end
答案 0 :(得分:1)
将评论嵌套在产品中,但将创作移至外部审核:
# 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
和: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
隐藏字段替换产品,如果是的话。
答案 1 :(得分:0)
你可以使用namespace
东西用其他东西包裹你的路线
答案 2 :(得分:-1)
移动资源:块外的评论
resources :products
resources :reviews
并使用
new_review_path
这样,您的评论不会受到任何产品的限制。