2016-10-27 56 views
1

我有了像companies (id, serial...), user (id, serial, company_id...),其中序列是一個隨機生成的字符5-20長字符串,而每個表獨特的表在Rails(4.2.6)應用程序。我想實現是有路線像/companies/:serial/users/:serial ...導軌 - 壓倒一切的名稱路由參數 - GLOBALLY

我看了documentation,並且可以做routes.rb如下:

resources :companies, param: :serial 
resources :users, param: :serial 

現在,這不是太乾.. 。有沒有辦法在全球範圍內做到這一點?我知道我可以在一行(resources :companies, :users, param: :serial)中有這個,但是在其他名稱空間中我還有其他表,我也希望將其應用於其他名稱空間。

我想到的另一件事是將序列作爲主鍵,但我更喜歡自動遞增的整數,並且不希望使用具有10-20個字符長值的列user.company_serial來拋棄我的數據庫...

我試圖做一個範圍與周圍我的資源param: :serial

scope param: :serial do 
    resources :companies 
    ... 
end 

path_names(文檔中讀取here),但並沒有取得預期的效果,反而增加params[:param]與符號值:serial由於某些原因,我不太明白。

我也知道方法to_param的存在,但如果我理解的很好,我應該在模型中使用它,所以我將不得不編寫與我擁有的許多模型相同的代碼。

+1

在每張桌子上顯式化並不一定是件壞事。偶爾DRY在Ruby中有點太過分了(閱讀回形針源代碼)。我認爲每個表格都明確地定義了它在本地空間中的串行資源。儘管如此,將前兩行合併爲一個似乎很實用。 – Pyrce

+1

@Pyrce,你是對的,但我想申請的規則來進行整個應用程序,我覺得如果一個sheperd開始歷數羊像「sheep1是白色的,sheep2是白色的,sheep3是白色的......」所有400他不是說所有的羊都是白色的......畢竟,這就是我要做的事情,如果沒有其他的辦法 – Misu

回答

1

你做到這一點的方法是在URL提交序列,你會用id PARAM,params[:id]完成,使用的控制器。

Company.find_by_serial(params[:id) 

您將不需要更改路由,只需控制器操作。這也可以乾涸。

你可以明確地傳遞串口,或通過增加to_param方法做到這一點。如果將to_param添加到模型中,它將始終在每個產生路線的地方都使用它,以便使用該標識併爲您節省一些工作量。如果有一個地方你寧願使用id(我喜歡這個在一些控制器中,比如管理員控制器),那麼你必須明確地通過它或解決這個問題。

+0

呀,好一個。我也想到了這一點,只是在我看來有點不好意思,我確信Rails會有一種'官方'的方法來幹掉它。再說,如果我認爲那代碼 - 說 - 兩年來,我可能會混淆自己與線'find_by_serial(PARAMS [:編號])' – Misu

+0

呀 - 同意。我在範圍方法中查找了一段時間,它似乎沒有采用param選項並將其傳遞給各個資源調用。我也會期待這一點。 – Swards