Rails共享控制器功能和菜单

时间:2012-07-13 16:16:44

标签: ruby-on-rails-3.1

很抱歉,如果这看起来很糟糕(最近睡不着觉),但我正在试图找出在控制器之间共享控制器(和方法)功能的最佳方法,而不需要为每个控制器编写相同的代码。

假设我有各种控制器使用相同的方法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等方法,对许多控制器来说都很常见。所以至少我有那部分工作:)

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果你要编写一堆几乎完全相同的控制器,似乎继承可能就是这里的方式。

创建一个控制器(让我们称之为BaseController)并为其提供您希望其他控制器拥有的所有方法。然后,每个其他控制器都可以从BaseController继承,只需覆盖您需要的方法,并设置类变量,例如要搜索的模型,要设置的实例变量等等。例如:

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

  class BooksController < BaseController
    @@model = Book
  end