2

コントローラーでインスタンス変数を管理することに圧倒されているので、それらを管理するためのより良い方法があるかどうかを考えています。

私の状況では、PagesControllerフロント ページのレンダリングを処理する があります。フロント ページには、もともと異なるコントローラーに属する複数の小さなフォームがあります (たとえば、新しい投稿フォームを作成し、専用の PostsController がありますが、便宜上、フロント ページだけで簡単に投稿できます)。それらはすべて、フォームを保持するために対応するインスタンス変数を必要とします (たとえば、新しい投稿フォームには @post オブジェクトが必要です)。

PagesController#indexフォームを機能させるには、これらのインスタンス変数を手動で my に追加する必要があることがわかりました。

@post = Post.new # similar for other objects
@some_other_var = OtherController.new # another one
@one_more = AnotherController.new # again
# even more @variables here when the website is big

これでも問題ないと思われる場合はcreateeditアクションが失敗したとき (たとえば、検証に合格しないとき) を考えて、前のページをレンダリングする必要があります。これらの行を再度追加する必要があります。実際には、レンダリングがあるときはいつでも、すべてのこれらの変数を含める必要があります。

そのようなコードを必要とするすべてのアクションに手動で入力するのは非常に面倒に思えます。また、Web サイトが複雑になると、そのうちの 1 つか 2 つを見逃すのは簡単です。

そのため、毎回同じコードを記述するのではなく、一度だけ含める必要があるように、そのような変数を管理するより良い方法があるかどうか疑問に思っています。

4

2 に答える 2

2

before_filter次のようなものを作成できます。

class ApplicationController < ActionController::Base
  ...
  ...
  protected

    def instance_variables_for_form
      @post = Post.new # similar for other objects
      @some_other_var = OtherController.new # another one
      @one_more = AnotherController.new # again
      # even more @variables here when the website is big
    end

  end

次のように使用します。

  class PagesController < ApplicationController
    before_filter :instance_variables_for_form, only: [:action]
    ...
    ...
  end

そして、必要に応じて任意のアクションから明示的に呼び出すこともできます。

于 2013-10-20T04:03:05.813 に答える
0

これらの変数を論理的にグループ化できる場合は、それらを Presenter オブジェクトに入れることを検討する必要があります。

アイデアを説明する良いブログ投稿は次のとおりです。http://blog.jayfields.com/2007/03/rails-presenter-pattern.html

于 2013-10-20T08:18:09.727 に答える