2010-06-30 73 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