Rails基于与ID不同的东西进行路由

时间:2011-10-13 19:31:12

标签: ruby-on-rails ruby routes

因此,当我想查看用户个人资料时,目前我有类似/ users / 1 /的内容。 Dunno这个问题有多简单或常见,我现在有点像Rails noob,但我怎样才能通过routes.rb将其更改为/ user / chiggins / chiggins是一个唯一的用户名? / p>

非常感谢!

5 个答案:

答案 0 :(得分:15)

您需要在用户模型中覆盖to_param方法:

class User
  def to_param
   username
  end
end

然后rails会自动使用它进行路由。见http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-i-to_param

答案 1 :(得分:4)

另一种考虑的可能性是friendly_id gem - https://github.com/norman/friendly_id

答案 2 :(得分:2)

答案 3 :(得分:1)

您可以通过在Resource实例上重新定义member_scope和nested_scope方法来获得每资源标识符自定义。

resources :users do
  @scope[:scope_level_resource].tap do |u|
    def u.member_scope
      "#{path}/:username"
    end

    def u.nested_scope
      "#{path}/:#{singular}_username"
      # member_scope also usable here, assuming username will be nowhere in nested routes.
    end
  end
end

关于下面#nested_scope的问题:当你在路由中做这样的事情时会被使用:

resources :members do
  resources :playlists, only: :index
end

然后,param将是:member_username而不是just:username。这在组合集合时在播放列表控制器中很有用,因此您可以推断出请求的范围。

答案 4 :(得分:0)

最好的方法是使用自定义参数定义路径:

match "/users/:username" => "users#show"

在您的控制器中,普通的旧参数[:id]将为params [:username],您可以使用以下命令从de DB获取用户:

User.find_by_username(params[:username])