【问题标题】:Passing :new to Rails url_for将 :new 传递给 Rails url_for
【发布时间】:2012-04-13 17:28:40
【问题描述】:

也许我很愚蠢,但 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),因为我正在为用户 cmets 和 post cmets 共享视图。

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      其中Comment 模型类名称。

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

      【讨论】:

        【解决方案3】:

        根据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 来打印出所有路线的正确名称。 希望这可以帮助, /萨勒诺斯特

        【讨论】:

          【解决方案4】:

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

          url_for([:new, user, comment])
          

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

          【讨论】:

          • 不,不幸的是没有错字,调用它会返回'/users/1/comments/new/1'(如果评论已被保留)或导致我的问题中提到的错误。
          猜你喜欢
          • 1970-01-01
          • 2016-10-18
          • 2016-07-08
          • 1970-01-01
          • 1970-01-01
          • 2015-01-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多