0

コントローラー アクション間でのコードの再利用について質問があります。かなり標準的な状況だと思うので、Rails のベスト プラクティスは何かに興味があります。

によって提供されるネストされたリソースをfilms持つ、対応するを持つリソースがあるとします。ネストされたリソースは、アクションとアクションを使用して単独でレンダリングできます。ただし、対応するフィルム ページに埋め込まれたコメントをレンダリングすることも可能である必要があります。FilmsControllercommentsCommentsControllerindexshow

CommentsControllerここで、内からコードを再利用する最善の方法は何FilmsController.showですか?

CommentsController.index1)文字列にレンダリングしてから、変数でフィルムビューに渡すように強制しますか?

または 2)CommentsController.indexそこからデータベース クエリを実行して、フィルム ビューで一種の「部分」として直接呼び出しますか?

または 3)CommentsControllerデータベース処理を担当する別のメソッドを作成し、 と の両方から呼び出しCommentsController.indexFilmsController.show対応するビューを両方の場所でも使用しますか?

私には、オプション 1) と 2) は少し面倒に思えますが、3) はモジュール化されておらず、コードの繰り返しが必要です。これを達成するためのより良い方法はありますか?

どうもありがとう!

4

1 に答える 1

0

ここで、FilmsController.show 内で CommentsController のコードを再利用する最善の方法は何ですか?

共有コントローラー ロジックをアプリケーション コントローラー (または lib に移動し、適切に必要とする) に移動することができます。

class ApplicationController < ActionController::Base

  def foo
    @foo = "foo"
  end

end

コメント コントローラ:

class CommentsController < ApplicationController

  before_filter :foo, :only => [:index]

  def index    
  end

end

フィルム コントローラー:

class FilmsController < ApplicationController

  before_filter :foo, :only => [:show]

  def show
  end

end

繰り返し表示ロジックの場合、それを共通フォルダーに移動して、your_app/app/views/shared/_foo.html.erb適切にレンダリングすることができます。


別のオプションは、関連するコードを外部モジュールに配置することです。

lib/mymodule.rb

module MyModule
  def foo
  end
end

次に、コントローラー内またはメソッドにアクセスしたい場所にモジュールを含めることができますfoo

class CommentsController < ApplicationController
  include MyModule

    def index
      foo()
    end

end
于 2013-01-23T20:02:02.657 に答える