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 ModelFunctions。该文件包含detect_uppercase上面使用的方法,并且在许多控制器中都很常见。所以至少我有那部分工作:)

任何帮助,将不胜感激。

4

1 回答 1

0

如果你要编写一堆做同样事情的控制器,看起来继承可能是这里的方法。

制作一个控制器(我们称它为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 回答