私は現在持っています:
class Tutorial
has_many :comments
end
class VideoTutorial < Tutorial
end
class Comments
belongs_to :tutorial
end
routes.rb
次のように読みます:
resources :tutorials do
resources :comments
end
Tutorial
次のような特定のタイプ(で始まるVideoTutorial
)を参照できるようにしたいと思います。
/tutorials/1234
/tutorials/1234/comments/new
/tutorials/1234/comments/6374
これは、チュートリアル(または他のサブクラスが登場するとき)Tutorial
ではなく、可能な限りチュートリアルを扱うことを意味します。VideoTutorial
すべての呼び出しを単一のコントローラーに送信し、上記のように単純なルーティングを使用したいと思います。
問題:今何が起こっているのか
Tutorial
私のフォームは、特定のインスタンスのタイプと一致する、多形的にルートと一致しているようです。
# @tutorial is a VideoTutorial
= form_for @tutorial do |f| # undefined method 'video_tutorial_path'
...
これはかなりクールですが、この状況で私が探しているものではありません:)
私は現在、これらのルートを生成することで物事を機能させています:
resources :tutorials do
resources :comments
end
resources :video_tutorials, :controller => "tutorials" do
resources :comments
end
新しいサブクラスが発生Tutorials
したときに多くのコントローラーが増殖するのを避けたいので、私はコントローラーに指示しています。Tutorial
しかし、これは厄介になります:
- あなたはたくさんの余分なルートを手に入れます
- の新しいサブクラスを追加すると、より多くのルートを取得できます
Tutorial
:video_tutorial_id
単なる一般的なものではなく、のようなパラメータを参照することになります:id
上記のシナリオのようTutorial
にすべてのタイプを扱いたいと思います。Tutorial
よりシンプルで面倒なアプローチは何ですか?
更新:@jdlの提案による
Tutorial
表示ページへのリンク:
# original approach:
= link_to 'Show', @tutorial
# now:
= link_to 'Show', tutorial_path(@tutorial)
form_for
ヘルパー:
# original approach:
= form_for @tutorial do |f|
# now:
= form_for @tutorial, :as => :tutorial, :url => tutorial_path do |f|
form_for
ネストされたリソース:
# original approach:
= form_for [@tutorial, @new_comment] do |f|
# now:
= form_for [@tutorial, @new_comment], :as => :tutorial, :url => tutorial_comments_path(@tutorial, @new_comment) do |f|
これは現在意図したとおりに機能します。
もう少し言葉遣い:)それをよりエレガントにすることについてさらに考えはありますか?