2013-05-07 99 views
0

我知道在嵌套资源中,您必须传递包含资源的id才能使其工作。Rails-如何在包含资源时路由到嵌套资源未设置

但是,我想允许用户为产品创建一个评论,并在新视图中指定表单中的产品,而不是实际将其传入到路径中。因此,不要在产品上进行审核,而应该有一个主审查表格,您可以在表格中选择任何产品。

我收到一个错误,试图做到这一点,无法弄清楚 - 什么是解决方案?

#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

顺便说一句,为什么你的行为中有@product = Product.new? – 2013-05-07 05:32:39

回答

1

请评论嵌套产品中的东西来包装你的路线,但移动创造的评论外:

# routes.rb 
resources :products do 
    resources :reviews, except: [:new, :create] 
end 

resources :reviews, only: [:new, :create] 

然后使用new_review_path创建一个新的审查。

如果您想要创建附加到特定产品的评论选项,请删除嵌套评论的:except选项,并根据product_id.present?修改控制器操作和表单。


编辑:(为响应和风的跟进问题)

在上面的例子中,我指定的: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的隐藏字段替换该产品。

+0

我可以只添加资源:在路径文件中的产品块之外进行评论并将其保留在那里,因此可以访问嵌套和未嵌入的资源?我已经在其他答案中看到过这个答案 – Zephyr4434 2013-05-08 03:03:39

+0

是的,没有什么可以阻止你这么做,这正是我在答案结尾处指出的。在这种情况下,两条路径都会调用相同的控制器操作,因此您需要确保它(以及可能的视图)正常工作。我已经添加了一些答案来扩展这一点。 – 2013-05-08 03:45:44

+0

非常感谢您的详细解答 – Zephyr4434 2013-05-15 00:45:22

-1

移动资源:块

resources :products 
resources :reviews 

,并使用

new_review_path 

这样外面的评论,您的评论是不束缚于任何产品。

+0

有其他解决方法吗?对于我的应用程序来说,评论只在产品环境中才有意义,所以它似乎是使用嵌套路线的理想情况... – Zephyr4434 2013-05-07 14:43:52

0

您可以使用namespace的事情与其他

+0

我不确定我是否理解,请您具体一点?对不起刚刚这个。 – Zephyr4434 2013-05-07 14:44:16