目前我有类似于 /users/1/ 这样的东西,当我想查看用户个人资料时。如何通过 routes.rb 更改为 /user/chiggins/,其中 chiggins 是唯一的用户名?
目前我有类似于 /users/1/ 这样的东西,当我想查看用户个人资料时。如何通过 routes.rb 更改为 /user/chiggins/,其中 chiggins 是唯一的用户名?
您需要做的是在User模型中重写to_param方法:
class User
def to_param
username
end
end
那么 Rails 将自动使用它进行路由。请参见 http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-i-to_param
:param
的参数。详见http://guides.rubyonrails.org/routing.html#overriding-named-route-parameters。您可以通过重新定义 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
resources :members do
resources :playlists, only: :index
end
那么,参数将是:member_username而不仅仅是:username。在播放列表控制器中组装集合时,这非常有用,因此您可以推断请求的范围。
最好的方法是定义一个带有自定义参数的路由:
match "/users/:username" => "users#show"
User.find_by_username(params[:username])