基于除ID之外的内容创建Rails路由。

14

目前我有类似于 /users/1/ 这样的东西,当我想查看用户个人资料时。如何通过 routes.rb 更改为 /user/chiggins/,其中 chiggins 是唯一的用户名?

5个回答

17

好的,我已经添加了那一小部分,但是我遇到了以下错误:http://chigstuff.com/uploads/user_error.jpg - Chiggins
没事了,我找到了问题所在。我的show方法是这样写的:“@user = User.find(:params[:id])”,我改成了通过用户名搜索。 - Chiggins
更改您的控制器代码:不是User.find(params[:id]),而是User.find_first_by_username(params[:id])或更改to_param的主体为"#{self.id}-#{self.username}"。 - Sławosz

5

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

那么,参数将是:member_username而不仅仅是:username。在播放列表控制器中组装集合时,这非常有用,因此您可以推断请求的范围。


我理解 "#{path}/:username",可以覆盖自动生成的路由,但是我不明白 "nested_scope" 方法是什么意思? - Matrix

0

最好的方法是定义一个带有自定义参数的路由:

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

在你的控制器中,普通的params[:id]将变成params[:username],你可以使用以下代码从数据库中获取用户:
User.find_by_username(params[:username])

我刚刚将那第一行添加到我的routes.db中,尽管我仍然需要使用:id而不是:username。 - Chiggins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接