2010-06-30 77 views
13

多態的路徑我有一個多態關聯,看起來像這樣:使用嵌套協會

class Line < ActiveRecord::Base 
    belongs_to :item, :polymorphic => true 
end 

class Education < ActiveRecord::base 
    has_many :lines, :as => :item 
end 

class Work < ActiveRecord::base 
    has_many :lines, :as => :item 
end 

我想一個簡單的方法來創建從父項的新線路。所以,我可能會編輯一個Work對象的視圖,並且想要創建一個新的Line對象的鏈接。通常情況下,我會這樣做:

<%= link_to "New Line", new_work_line_path(@work) %> 

而助手會爲此工作。然而,這要求我檢查控制器中哪條父行屬於哪個父級,否則就會破壞多態性的目的(如果情況如此,我可以使用兩個引用)。所以,我的問題是,我如何獲得像普通路徑助手一樣的多態工作路徑?

+1

「我正在尋找的是一種可以看待工作對象,並創建新線的方法。」這句話讓我非常困惑。謹慎改寫? – 2010-06-30 01:51:44

+0

我編輯的問題更清晰。 – Zoe 2010-07-01 18:06:09

回答

7

一種可能的方法可以是使用的路線是這樣的:

map.resources :works do |works| 
    works.resources :lines 
end 

map.resources :educations do |edu| 
    edu.resources :lines 
end 

你LinesController保持不變,你會得到路線這樣的:

work_lines GET /works/:work_id/lines 
.... 
education_lines GET /educations/:education_id/lines 
... 

最可氣的部分是管理通過的第一個ID,因爲您將有一個params[:id]提到一條線,但您也將有params[:work_id]params[:education_id]。在這裏你必須選擇檢查哪個參數被傳遞,或者至少解析請求的URL以確定你在哪個(Works,Educations等)。

希望這有助於;)

編輯:

根據意見是什麼出現了,你可以使用polymorphic_url/polymorphic_pathhttp://api.rubyonrails.org/classes/ActionDispatch/Routing/PolymorphicRoutes.html):

這是有道理的,如果你使用他們喜歡這樣:

link_to "New Line", polymorphic_url(@line.item,@line) 
# => /<educations_or_works>/item_id/lines/line_id 

至少,你甚至可以用它來收藏:

link_to "New Line", polymorphic_url(@line.item,Line.new) 
# => /<educations_or_works>/item_id/lines/ 

乾杯,
一個。

+1

這是一種做到這一點的方法,但它根本不是多形的。我發現了很多變化,看起來好像多態關聯包含在ActiveRecord中,但在其他地方完全被遺忘。我希望事實並非如此,我只是看錯了地方。不過,如果我找不到其他的東西,我會記住這一點。 – Zoe 2010-07-01 18:08:55

+0

我向你展示了保留polymorphyc模型關聯的路線。 – 2010-07-02 08:02:39

+0

沒錯,但是路線並不是多態的,這就是我要找的。路線是特定於該線是屬於工作單位還是教育單位,因爲控制單元的結果(:word_id和:education_id)。因爲這兩者都被認爲是與作爲Item對象的行相關聯的,所以如果有一種方法可以獲得可以表示Work或Education的item_id,那麼這將是有意義的。 – Zoe 2010-07-02 15:35:30