Rails - 未设置包含资源时如何路由到嵌套资源

时间:2013-05-07 04:48:19

标签: ruby-on-rails

我知道在嵌套资源中,你必须传递包含资源的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

3 个答案:

答案 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

这样,您的评论不会受到任何产品的限制。