0

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

3 回答 3

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 的后续问题)

在上面的示例中,我已经指定:newand: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如果它是。

于 2013-05-08T00:18:31.057 回答
0

你可以用namespacething 来用别的东西包裹你的路线

于 2013-05-07T07:23:35.993 回答
-1

移动资源:块外的评论

resources :products
resources :reviews

并使用

new_review_path

这样,您的评论就不会与任何产品挂钩。

于 2013-05-07T05:30:28.790 回答