Hell frens在显示页面中用用户名替换user_id在rails中
我想在用户的显示页面中显示用户名而不是user_id。
例如,
一个usr_id 300为名为哈里用户存在于数据库中。因此,如何显示
,而不是
在url
。
这可以从路线文件内完成吗?
感谢
Hell frens在显示页面中用用户名替换user_id在rails中
我想在用户的显示页面中显示用户名而不是user_id。
例如,
一个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的航线目前有什么认识。清理你不需要的东西也是很好的做法。 ;)
尝试在routes.rb中这样的事情
map.user_permalink 'users/:user_name', :controller => 'users', :action => 'show'
的意见以后使用这样的:
<%= link_to user.name, user_permalink_path(user.user_name.parameterize) %>
我不知道,如果代码将通过简单的工作粘贴它,但你明白了:)
如果你想拥有/:用户名,那么试试你的routes.rb文件(这应该是块的最后一行! - 最后路线创建)
match "/:id", :to => "users#show", :as => :friendly_user
然后,只是为了使它不那么可怕,你可以使用the 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)。
希望帮助,
尼古拉斯福伊萨萨
雅它似乎取代id(300)的名称**哈利**,但也给了错误说没有找到与id哈里的记录。我粘贴了“get'/:username'=>'users#show' ,::constrain => {:username =>/[a-zA-Z - ] + /}“到路径文件的底部,并将其添加到我的用户模型012_我是否错过了某些东西或者我做错了什么? – Gagan 2011-02-28 10:43:50
@Gagan您仍然需要更新您的控制器方法以从用户名参数中查找用户。默认类似于'User.find(params [:id])',它需要数字主键id。你想要的东西像'User.find_by_username(params [:username])'而不是。 – coreyward 2011-02-28 15:25:46