【问题标题】:Help with Rails routes帮助 Rails 路线
【发布时间】:2009-03-30 11:29:50
【问题描述】:

假设我有一个控制器配置文件,它只有两个操作。第一个是list,它将只显示名称列表。我希望这些名称成为链接,然后将您带到显示完整个人资料的页面。所以我需要第二个操作,view,然后它可以输入一个参数来指示要查看哪个配置文件。

例如:我将访问/profile/list,然后如果我想查看 John 的个人资料,我将点击他的名字,这应该会将我带到 /profile/view/john。我的视图操作将读取 john 参数,然后进行适当的数据库查询。

我必须对 routes.rb 进行哪些更改才能发生这种情况?干杯。

【问题讨论】:

    标签: ruby-on-rails routes


    【解决方案1】:

    我宁愿使用默认的 :controller/:action/:id 路由来防止列表中有 2 个 John 的情况。

    拥有您提到的自定义路线 编辑 Routes.rb 以包含一个新的

    map.connect ':controller/:action/:user_name'
    

    现在像 profile/view/john 这样的请求应该会以

    的形式发送给您
    @params = {:controller => "profile", :action=> "view", :user_name => "john"}
    

    使用 params[:user_name] 值在控制器的视图操作中定位和显示相关记录。您还可以对 :user_name 部分的 url 设置一些要求,例如它必须匹配 /SomeRegexpToValidateNames/

    map.connect ':controller/:action/:user_name',
       :requirements => {:user_name => /\w+/}
    

    【讨论】:

    • 如何更改 map.connect ':controller/:action/:user_name' 以便对配置文件/视图进行硬编码。因为我不关心 /one/two/three 之类的其他事情。
    • /one/two/three 将尝试在 one_controller 上调用名为 two 的操作。 Rails 应该无法找到它并使用“未找到通用页面”来处理它。如果你真的想硬编码,你可以指定更严格的 :requirements => {:controller=>/profile/, :action=>/view/,..}
    【解决方案2】:

    如果您想通过名称识别配置文件,例如“/profile/view/john”,您可以使用 permalink_fu 插件

    http://www.seoonrails.com/even-better-looking-urls-with-permalink_fu

    这会让你在名字重复时避免麻烦......

    【讨论】:

      【解决方案3】:

      如果模型是“用户”,则必须重写 to_param 方法。这将允许您返回用户的“id-name”而不是“id”。 (例如:/profile/view/23-john)

      我知道,这并不完全符合您的要求,但这应该是一个简单的解决方案。

      class User < ActiveRecord::Base
        def to_param
          "#{id}-#{name.gsub(/\W/, '-').downcase}"
        end
      end
      

      只需在路由配置中添加一个简单的资源声明:

      map.resources :users
      

      【讨论】: