0

コントローラーを 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

私のアプローチはすべて間違っていると考えています。喜んで教育を受けたいと思います。繰り返しますが、「デフォルトで初期化されているだけのモデルでパーシャルをレンダリングする」ことは答えではありません。

4

1 に答える 1