2011-02-27 67 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)。

希望幫助,

尼古拉斯福伊薩薩