1

私は現在持っています:

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|

これは現在意図したとおりに機能します。

もう少し言葉遣い:)それをよりエレガントにすることについてさらに考えはありますか?

4

1 に答える 1

2

:asのパラメータを見てくださいform_for

http://apidock.com/rails/ActionView/Helpers/FormHelper/form_for

于 2012-09-17T01:17:30.290 に答える