2014-01-08 54 views
1

我正在開發一個Ruby on Rails應用程序,我的路線可以正確處理類似http://localhost:3000/CA這樣的內容,以轉到某個關於加州的頁面。它處理小寫「ca」,但有沒有辦法讓我的用戶手動輸入小寫「ca」,URL/Routes將顯示大寫「CA」?在routes.rb中將參數從小寫變成大寫?

回答

1

如果http://localhost:3000/ca用戶請求時,它應該重定向到(301重定向)http://localhost:3000/CA, ,你可以在你的控制器

def controller_name 
    if(params[:id].to_s != params[:id].to_s.upcase) 
    redirect_to urlname_url(:params[:url].to_s.upcase), :status => :moved_permanently 
    end 
    # rest of the code 
end 

這是好事,有獨特的網址,如重複的URL對SEO的負面影響處理。

+0

是否有全局配置(或約束中指定的默認正則表達式)來執行此操作? – Ben

0

您可以使用路線匹配重定向到所需路線的大寫版本。

我不知道你的路線文件是什麼樣子,所以我會爲你提供一個簡化版本的東西,我想出了你可以用來構建你需要的東西。

假設我有一個states控制器,它對每個單一狀態縮寫都有一個動作。我可以宣佈這樣我的路線(爲get行動StatesController#CA(加利福尼亞州)):

get '/CA', to: 'states#ca' 

這隻會匹配大寫CA,因此,如果用戶鍵入http://localhost:3000/ca,他們會得到一個錯誤。爲了解決這個問題,我可以匹配'/ ca'到'/ CA':

get '/ca', to: redirect('/CA') 

這是非常簡化的。您不太可能想要在路線文件中明確地描述每個州的縮寫。

同樣,我不知道你在路由文件中使用了什麼,所以我只能告訴你(而不是告訴你一個例子)你可以提供一個塊來處理這個邏輯。

使用塊,你也可以創建一個將辦案,當人們利用不一致的縮寫,以及(象轉化cACaCA)的邏輯。

這裏有一些有用/相關的文檔:http://guides.rubyonrails.org/routing.html#redirection

+0

請注意,此形式的重定向應該可以工作,但會涉及額外的往返行程和相關的延遲(您將「301永久移動」返回給瀏覽器,並且通常會在新地址重試)。由於它只發生在用戶第一次手動輸入URI(並且大概是之後點擊鏈接),所以它不會太糟糕。 –