也许我很愚蠢,但Rails提供了这种生成URL的漂亮语法,如下所示:
url_for([user, comment]) # => /users/1/comment/1
传递:edit
允许我创建这样的内容:
url_for([:edit, user, comment]) # => /users/1/comment/1/edit
但有一些方法可以做到吗?
url_for([:new, user, comments]) # => NoMethodError: undefined method `new_user_comments_url'
更新:添加了更多信息。
我的routes.rb:
resources :users do
resources :comments
end
resources :posts do
resources :comments
end
我的问题是,我无法使用Rails自动生成的url帮助器(user_comments_url
),因为我正在共享用户注释和发表评论的视图。
对于我的问题,有两种解决方法(但没有人感觉像“Rails”):
向视图添加逻辑,例如一些条件。
定义我自己的网址助手,例如new_parent_comment(user_or_blog)
。
答案 0 :(得分:4)
好的,找到了解决方案,但我不确定这是否是预期的:
url_for([:new, user, :comment]) # => '/users/1/comments/new'
url_for([:new, post, :comment]) # => '/posts/1/comments/new'
答案 1 :(得分:2)
根据Rails Docs url_for使用传递的对象的类名来生成RESTful路由。它还指出,对于嵌套路由,它无法正确地做出这样的假设:
如果您有一个嵌套路由,例如admin_workshop_path,您必须明确调用它(url_for无法猜测该路由)。
我建议使用类似new_user_comment_path()
的命名路线。我假设你已经设置了你的routes.rb之类的东西:
resources :users do
resources :comments do
end
end
此外,您可以运行rake routes
打印出所有路线的正确名称。
希望这可以帮助,
/ Salernost
答案 2 :(得分:1)
遇到同样的问题,找到了下一个解决方案(在Rails 5.2上进行了测试):
url_for([user, Comment, action: :new])
其中Comment
模型类名称。
顺便说一句,action
也可以是:edit
。
答案 3 :(得分:0)
这可能只是一个错字吗?我认为最后一行应该是comment
,而不是comments
:
url_for([:new, user, comment])
(假设您的comment
变量已定义。)