2011-09-13 37 views
0

我已經通過Vanity gem設置了路徑文件以包含用戶名。如何讓我的Rails 3.1應用程序接受URL中帶有'@'符號的路線?

但是,現在我只能做一個特定的URL--即他們的用戶名。

因此,通過創業板所產生的路線是這樣的:

controller :vanities do 
    match ':vname' => :show, :via => :get, :constraints => {:vname => /[A-Za-z0-9\-\+]+/} 
    end 

所以說用的用戶名test有人註冊時,系統自動的將其創建基於vname對他們的用戶名。但是如果他們轉到mydomain.com/@test會發生什麼情況,我希望他們最終在相同的路線上,就好像他們剛剛去了/test一樣。

我該怎麼做?

回答

1

你可以讓你的虛榮心名稱的開頭帶有可選的@:

controller :vanities do 
    match ':vname' => :show, :via => :get, :constraints => {:vname => /@?[A-Za-z0-9\-\+]+/} 
end 

你將不得不以脫去@在你的控制器動作,這樣的:

params[:vname].gsub!(/\[email protected]/, '') 

更新

如果您希望在您的所有控制器中完成替換,您可以在的before_filter中執行替換:

class ApplicationController < ActionController::Base 
    before_filter :rename_vanity 

    def rename_vanity 
    params[:vname].gsub!(/\[email protected]/, '') if params[:vname] 
    end 
end 
+0

我知道如何將它添加到我的虛榮名稱的約束中。問題是,當有人註冊時,他們不會在他們的「用戶名」字段中指定「@用戶名」,我也不希望他們。我只想讓他們註冊'test',他們可以做'mydomain.com/test'以及'mydomain.com/@ test'。所以基本上我想要做的就是讓用戶只註冊一個由RegEx'[A-Za-z0-9]'捕獲的常規字符串,但我希望路由器自動處理URL上的@前綴。 – marcamillion

+0

順便說一句,我嘗試這樣做的一種方式是在創建新用戶時,我爲每個用戶創建了兩個虛擬空間 - 一個用「@」和一個不用。然後我在'vanities'控制器的約束中添加了'\ @'異常。但這並不奏效,因爲虛榮寶石只需要每個用戶一個虛榮URL。所以這從來沒有正常工作。 – marcamillion

+1

@marcamillion我不明白,我相信我告訴過你該怎麼做。修改路由中的正則表達式,並將修改params的代碼放在'app/controllers/vanities_controller.rb'中'show'動作的開頭。只需註冊您的用戶而不用@,它就會在路線中自動處理。我們正在談論這個寶石,對吧? https://github.com/jaustinhughey/vanities.git –

0

@符號是在URL中保留字符,和特定上下文@被保留用於外部使用時必須是百分比編碼(如%40)。網址mydomain/@test根本無效。

+1

你是完全正確的,瀏覽器似乎沒有非常挑剔。我用firefox測試了我的答案,它的工作沒有抱怨。 –

+0

這可能是'正確',但爲什麼http://www.twitter.com/@marcgayle工作呢?我想要那個功能。我不想從標準的角度來看完美。我只是想要這個功能。 – marcamillion

+0

我不知道Twitter網址接受了@符號。我只是熟悉鏈接與濫用角色的行爲。我不知道爲什麼這是一個例外,雖然我猜測這是因爲保留的用途足夠深奧,因此可以安全地忽略「誤用」。 (幾分鐘的搜索後,我實際上無法找到'正確的'保留使用應該是什麼)。 – joanwolk

相關問題