2011-03-28 44 views
2

我有一個對象,必須有一個類似於「1.3.6.1.4.1.25623.1.0.14377」的id。當我嘗試創建一個使用id的鏈接(如link_to my_object(object.id)),Rails 3 barfs並且說沒有路由存在。Rails 3路由非數字ID的

我已通過嘗試link_to my_object(1)驗證了我有一個有效的路線。 Rails在創建這個鏈接時沒有問題。

任何想法?

在此先感謝!

+0

你的routes.rb文件是什麼樣子的? – 2011-03-28 17:04:02

+0

它只是有一個簡單的資源語句('資源:nvts')。 – reedswenson 2011-03-28 19:08:17

回答

4

我已經想通了......默認情況下,當在參數字段(在這種情況下是id)中找到句號(。)時,Rails會感到怪異。要改變這種行爲,只需在您的路由語句中添加一個:constraints指令並明確告訴它參數應該是什麼樣子。在我的情況下,原來,下面解決了這一問題:

resources :nvts, :constraints => { :id => /[0-9\.]+/ } 

感謝Avdi Grimm對他最有用的博客文章。

0

也許您應該在您的模型中覆蓋方法to_param,Rails使用它來生成路由的ID。 通常它看起來是這樣的:

def to_param 
    object.parameterize 
end 

它得到了模型的名稱和ID在路線使用。

+0

對不起,沒有工作...... Rails仍然拋出ActionView :: Template :: Error(沒有路由匹配{:action =>「show」,:id =>「1.3.6.1.4.1.25623.1。 0.18413「,::controller =>」nvts「}):'當我link_to」顯示「時,nvt_path(nvt.id)'。 'link_to「顯示」,nvt_path(1)'呈現我所期望的。 – reedswenson 2011-03-28 19:02:31

+0

此方法應在模型類中。通過這樣做,你可以從ActiveRecord :: Base重寫方法。然後檢查rails console:your_object.to_param =>應該返回模型的名稱。 – megas 2011-03-28 19:12:19

+0

my_object.to_param按預期返回ID。 Rails仍然拋出相同的錯誤。我的對象不是ActiveModel :: Base的後代。那是問題嗎? – reedswenson 2011-03-28 19:30:35