0

これがばかげているように思われる場合は申し訳ありませんが(最近はあまり眠っていません)、コントローラーごとに同じコードを記述せずに、コントローラー(およびメソッド)の機能をコントローラー間で共有する最良の方法を見つけようとしています。

と呼ばれる同じメソッドを持つさまざまなコントローラーがあるとしましょうsearch。このメソッド内には、次のような異なるコントローラーの同じ用語の状況があります。

    case term
      when "beginning_parens"
       @books = Book.where("title REGEXP ? AND localeLanguage LIKE ?", '^\\([0-9]*\\)', params[:language]).not_locked.reorder(order).paginate(:page => params[:page])
      when 'search_all_caps'
       @books = Book.detect_uppercase.not_locked.reorder(order).where("localeLanguage LIKE ?", params[:language]).paginate(:page => params[:page])

今は、コントローラーごとにすべてを記述する必要はありません。params[:language]また、各ケースに、 などを渡す必要はありませんpaginate。各ケースを言語で検索し、ページネーションも行いたいからです。

またはもちろん、インスタンス変数は、、 などで@booksはなく、コントローラー間で変更されます。@dvds@games

paramsまた、メニュー リンク内のすべてを渡さなければならないことに気付きました。

= link_to 'with all CAPS', books_search_path(:term => 'search_all_caps', :language => params[:language])

そして、これを行うためのより良い方法が必要であると確信しています。

モデルの共通メソッドは、各モデルの先頭で呼び出すファイルで既に共有していますextend ModelFunctionsdetect_uppercaseこのファイルには、上記で使用され、多くのコントローラーで共通のメソッドが含まれています。したがって、少なくとも私はその部分が機能しています:)

どんな助けでも大歓迎です。

4

1 に答える 1

0

ほぼ同じことを行う一連のコントローラーを作成する場合は、継承がここでの方法のように思われます。

コントローラーを 1 つ作成し (これを と呼びましょうBaseController)、他のコントローラーに必要なメソッドをすべて与えます。次に、他の各コントローラーは、必要なメソッドを継承しBaseControllerてオーバーライドし、検索するモデ​​ル、設定するインスタンス変数などのクラス変数を設定できます。例えば:

  class BaseController < ActionController::Base
    def search
      @@model.where("title REGEXP ? AND localelanguage ...")
    end
  end

  class BooksController < BaseController
    @@model = Book
  end
于 2012-07-13T16:52:31.837 に答える