传递:新的Rails url_for

时间:2012-04-13 17:28:40

标签: ruby-on-rails-3 url-routing restful-url

也许我很愚蠢,但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”):

  1. 向视图添加逻辑,例如一些条件。

  2. 定义我自己的网址助手,例如new_parent_comment(user_or_blog)

4 个答案:

答案 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变量已定义。)