很抱歉,如果这看起来很糟糕(最近睡不着觉),但我正在试图找出在控制器之间共享控制器(和方法)功能的最佳方法,而不需要为每个控制器编写相同的代码。
假设我有各种控制器使用相同的方法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
等方法,对许多控制器来说都很常见。所以至少我有那部分工作:)
任何帮助将不胜感激。
答案 0 :(得分:0)
如果你要编写一堆几乎完全相同的控制器,似乎继承可能就是这里的方式。
创建一个控制器(让我们称之为BaseController
)并为其提供您希望其他控制器拥有的所有方法。然后,每个其他控制器都可以从BaseController
继承,只需覆盖您需要的方法,并设置类变量,例如要搜索的模型,要设置的实例变量等等。例如:
class BaseController < ActionController::Base
def search
@@model.where("title REGEXP ? AND localelanguage ...")
end
end
class BooksController < BaseController
@@model = Book
end