地狱狂热者
我想在用户的显示页面中显示用户名而不是 user_id。
例如,
名为 harry 的用户的 usr_id 300 存在于数据库中。那么如何展示
代替
在网址中。
这可以在路由文件中完成吗?
谢谢
地狱狂热者
我想在用户的显示页面中显示用户名而不是 user_id。
例如,
名为 harry 的用户的 usr_id 300 存在于数据库中。那么如何展示
代替
在网址中。
这可以在路由文件中完成吗?
谢谢
这通常被称为虚 URL,只要稍加注意,您就可以很容易地处理它。第一的...
在您的路线中:
# the simple case
get '/:username' => 'users#show', :constrain => { :username => /[a-zA-Z-]+/ }
# ...with vanity_url_path(@user) helpers
get '/:username' => 'users#show', :as => 'vanity_url'
# or routing something more complicated with all the default resourceful routes
resources :users, :path => '/:username'
# or even just defining a bunch of routes for users with this format
controller :users, :path => '/:username' do
get '/profile', :action => :profile #=> /johnsmith/profile => UsersController#profile
end
在上面的代码中,:constrain
为了清楚起见,我避免为每条路线重复选项。您将需要调整正则表达式以匹配您的用户名,然后确保在您使用的任何路线上都有它。
如果这将成为从您的应用程序中访问用户的默认方式(即,不仅仅是访问用户配置文件的便捷方式),您将需要覆盖to_param
用户模型上的方法。这允许您在不指定其他参数的情况下使用url_for
帮助程序。form_for @user
class User
def to_param
username
end
end
另一个快速提示:如果您正在使用您的路线并尝试做比基础更多的事情,请务必$ rake routes
经常从命令行调用以查看 Rails 当前识别的路线。清理你不需要的也是一件好事。;)
如果你想拥有 /:username,然后在你的 routes.rb 文件上试试这个(这应该是最后一行!- 创建最后一条路线!)
match "/:id", :to => "users#show", :as => :friendly_user
然后,为了让它不那么可怕,您可以使用make_permalink gem轻松创建友好的 url 名称并覆盖模型中的 to_param 方法
# models/user.rb
make_permalink :username
def to_param
permalink
end
为了使它更好,覆盖 User.find 方法以通过永久链接或 id 工作
def self.find(query)
self.find_by_username(query) || super(query)
end
这适用于 User.find(1) 或 User.find(my_username)。
希望有帮助,
尼古拉斯·霍克·伊萨萨
在 routes.rb 中尝试这样的事情
map.user_permalink 'users/:user_name', :controller => 'users', :action => 'show'
稍后在视图中像这样使用它:
<%= link_to user.name, user_permalink_path(user.user_name.parameterize) %>
我不确定代码是否只需粘贴就可以工作,但你明白了:)