2009-10-19 97 views
0

我有我的代碼的路線,看起來像這樣:問題與友好的URL路由的名稱,而不是ID

map.app 'applications/:title_header', :controller => 'apps', :action => 'show' 

我也改變了我的表演方法,在控制器中是這樣的:

@app = App.find_by_title_header(params[:title_header]) 

如果我輸入applications/title事情工作正常。如果我在applications/1(有效身份證件),鍵入它失敗(如預期)

然而,當我試圖使用友好的URL傭工,在這種情況下app_path(@app)所生成的網址看起來像applications/1。唯一能讓它工作的方法是放入app_path(@app.title_header)。看起來好像它只是「知道」這個ID是從應用程序對象中傳出來的,它應該「知道」它現在應該默認傳遞該名稱。我需要改變什麼?

+0

那麼,當你有友好的網址「1234」,這將與ID一致嗎? – Zepplock

+0

你假設應用程序在routes.rb中被列爲資源。即便如此,路由將使用描述所請求url的第一個匹配條目。 – EmFi

回答

0

其實我最終做的並沒有觸及to_param。與其他頁面一樣,我需要to_param是一個ID,而不是固定鏈接。

我結束了剛剛通過@app.permalink到URL方法,而不是觸及to_param,但那一個仍然是有用的知道。

-1

聽起來正確。 Rails並不認爲它在命名路由中遇到的符號是對象上的方法。

解決這個問題的最好方法是向application_helper.rb添加一個自定義助手,該助手創建需要使用的語法並將其傳遞給更基本的url版本。

def my_app_path(object, args) 
    if object.responds_to? :title_header 
    app_path(object.title_header, args) 
    else 
    raise "Cannot generate url from object, missing title_header" 
    end 
end 
3

最簡單,最輕的解決方法就是使用to_param:

class Application < ActiveRecord::Base 

    def to_param 
    title_header.parameterize 
    end 

end 

字符串實例方法parameterize將確保該字符串是適當的URL。然後,在您的控制器中,您只需更新所有find即可使用find_by_title_header而不僅僅是find

確保你是title_header s將是唯一的!

+0

謝謝我最終做了這樣的事情... –