コントローラーを DRY に保つ方法を決定しようとしていますが、アプリの多くの場所に含まれるサブビュー (または他のプラットフォームのコントロール) と見なされるものがあります。
これを処理するための典型的な RoR DRY アプローチはありますか?
例として、「このページを評価する」タイプのコントロール/ビューが役立つ場合があります。これはさまざまな種類のページ コントローラーに含まれますが、特定のページ コントローラーの「拡張機能」とは思えません。別の適切な例として、「専用」ビューなしで利用できる「お問い合わせ」フォームがあります。
答えのない別の同様の質問があります: https://stackoverflow.com/questions/18408016/initializing-object-for-modal-form
唯一のコメントは、提案されたソリューションが標準的な設計慣行を破っていることを認めています。
詳細:
セッションデータへのアクセス(ユーザー固有のデータをロードするため、またはユーザーがセッションごとに1回だけアクションを許可されるようにするためなど)、検証情報へのアクセス(投稿時のエラー処理用)、さまざまなビューに含まれる場合があります。
私が現在「修正」しようとしている問題は、ビュー固有のロジックと出力が既にあるビューに要素が含まれている場合に、コードを「DRY」することです。
それでは、例としてコンタクトフォーム要素を考えてみましょう。クライアントがほとんどのページの下部にメッセージを送信できるようにしたい (さまざまなコントローラーが明らかにサイトを構成している)。コントローラーの 1 つは、データベース出力 (記事) を含むニュース ページです。したがって、この 1 つのコントローラーは、ニュース記事とそのビューを管理するように設計されています。連絡先フォームのコントローラーにイニシャライザーを入れるのはなぜですか? ユーザーが無効なフォームを投稿しようとした場合、誰がエラーを受け取りますか? エラーはインラインである必要があると思います。そのため、ニュース記事を再入力するだけでなく、連絡先フォームでユーザーに適切に警告する必要があります。
class PageController < ApplicationController
before_filter :collect_for_output
def collect_for_output
# some kind of business logic for grabbing the correct articles for
# page we're on
@articles= Article.all
end
def index
# this initialisation doesn't belong in this controller
# it should be in its own controller
# I'm talking about initialisation that is dependent on session data
# Say for a supplied name field I might pre-populate it with the
# current users's name, otherwise allow it to be sent anonymously
@message = Message.new
end
def post_message
# this does *not* belong here but how else do I handle validation
# in the current view?!? also how do I determine which view in this
# controller made the post
end
end
class NotAPageController < ApplicationController
# this controller is nothing like a PageController, but I might
# want the contact view available in these views too... how do I handle
# the initialisation? (in these cases I'm talking about common
# initialisation)
end
私のアプローチはすべて間違っていると考えています。喜んで教育を受けたいと思います。繰り返しますが、「デフォルトで初期化されているだけのモデルでパーシャルをレンダリングする」ことは答えではありません。