2011-02-27 71 views

回答

14

这通常被称为个性化网址,和一点点谨慎,你可以很容易地处理这个问题。第一...

  1. 请确保这是你的路线中的最后一件事。您不希望用户名覆盖另一个控制器的名称空间。
  2. 使用明智的排除列表来防止用户拥有管理员,支持,官方,安全等用户名。

在你的路线:

# 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的航线目前有什么认识。清理你不需要的东西也是很好的做法。 ;)

+0

雅它似乎取代id(300)的名称**哈利**,但​​也给了错误说没有找到与id哈里的记录。我粘贴了“get'/:username'=>'users#show' ,::constrain => {:username =>/[a-zA-Z - ] + /}“到路径文件的底部,并将其添加到我的用户模型012_我是否错过了某些东西或者我做错了什么? – Gagan 2011-02-28 10:43:50

+0

@Gagan您仍然需要更新您的控制器方法以从用户名参数中查找用户。默认类似于'User.find(params [:id])',它需要数字主键id。你想要的东西像'User.find_by_username(params [:username])'而不是。 – coreyward 2011-02-28 15:25:46

0

尝试在routes.rb中这样的事情

map.user_permalink 'users/:user_name', :controller => 'users', :action => 'show' 

的意见以后使用这样的:

<%= link_to user.name, user_permalink_path(user.user_name.parameterize) %> 

我不知道,如果代码将通过简单的工作粘贴它,但你明白了:)

4

如果你想拥有/:用户名,那么试试你的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)。

希望帮助,

尼古拉斯福伊萨萨