2

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

更新:添加了更多信息。

我的路线.rb:

resources :users do
  resources :comments
end

resources :posts do
  resources :comments
end

我的问题是,我不能使用 Rails 自动生成的 url helper ( user_comments_url),因为我正在共享用户评论和发表评论的视图。

我的问题有两种解决方法(但没有人觉得像“Rails”方式):

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

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

4

4 回答 4

4

好的,找到了解决方案,但我不确定这是否是预期的:

url_for([:new, user, :comment]) # => '/users/1/comments/new'

url_for([:new, post, :comment]) # => '/posts/1/comments/new'
于 2012-04-13T21:20:50.193 回答
3

遇到同样的问题,找到了下一个解决方案(在 Rails 5.2 上测试):

url_for([user, Comment, action: :new])

其中Comment模型类名称。

顺便说一句,action也可以:edit

于 2018-08-21T06:15:27.280 回答
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

于 2012-04-13T18:06:45.137 回答
0

这可能只是一个错字吗?我认为最后一行应该是comment,而不是comments

url_for([:new, user, comment])

(假设您的comment变量已定义。)

于 2012-04-13T20:59:55.117 回答