2012-09-20 26 views
1

場景: 我想要一個url路徑,您可以通過:id:name:查看某個人。
對於user/5/user/tom都會指向同一個用戶rails可選參數類型:id或:name

的routes.rb

controller 'user' do 
    get 'user/:id' 
    get 'user/:name' 
end 

測試/路由/ user_routes.rb

test "/user/:id" do 
    assert_routing "/user/5", :controller => "user", :action => "find_by_id", :id=>"5" 
end 

test "/user/:name" do 
    assert_routing "/user/tom", :controller => "user", :action => "find_by_name", :name=>"tom" 
end 

我並不完全確定如果這是正確的URL路徑設計決策。
尋找指導

回答

2

我不認爲你正在做的事情是去工作,因爲你給的路線是不明確的,因爲軌道路線不能說像URL用戶/ 15具有名稱或ID。

當然有一種方法可以做到這一點,通過指定正則表達式。由於ID將永遠是一個數字,我們可以有正則表達式檢查它

controller 'user' do 
    get 'user/:id', :id => /\d+/ 
    get 'user/:name', :name => /[A-Za-z][\w\s]+/ 
end 

上述語句把正則表達式的約束。在你的控制器,你可以檢查像

if params[:id] 
# Get by id 
else 
# Get by name 

你也可以做到這一點通過passsing GET參數,並以同樣的方式處理它的控制器。

謝謝

+0

我認爲關於模棱兩可的反饋是正確的。我喜歡你提供的解決方案,但也許我需要重新思考我的URL路徑設計。 – alenm