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) %>

そして、ヘルパーはこのためのルートを実行します。ただし、これには、ラインがコントローラー内でどちらの親に属しているかを確認する必要があり、ポリモーフィズムの目的が無効になります(その場合は、2つの参照を使用できます)。だから、私の質問は、パスを通常のパスヘルパーのように多形的に機能させるにはどうすればよいですか?

4

1 に答える 1

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]参照される Lineがあるためですが、 params[:work_id]orもあるからparams[:education_id]です。ここでは、渡されたパラメーターを確認するか、少なくとも要求された URL を解析して、自分がどちらに属しているか (仕事、教育など) を判断するかを選択する必要があります。

これが役に立ったことを願っています;)

編集:

コメントで明らかになった内容によると、polymorphic_url/ polymorphic_path( http://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/

乾杯、
a.

于 2010-06-30T11:14:51.973 に答える