2012-07-13 53 views
0

对不起,如果这似乎愚蠢(最近没有太多的睡眠),但我试图找出在控制器之间共享控制器(和方法)功能的最佳方式,而无需为每个控制器编写相同的代码。Rails共享控制器功能和菜单

比方说,我有不同的控制器与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

如果你打算写一堆控制器来做同样的事情,那么继承似乎就是这里的一种方式。

使一个控制器(我们称之为BaseController),并给它所有你想要的其他控制器拥有的方法。然后,每个其他控制器都可以从BaseController继承,只需重写所需的方法,并为要搜索的模型,要设置的实例变量等设置类变量。例如:

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

    class BooksController < BaseController 
    @@model = Book 
    end 
+0

谢谢。不会把所有这些放到application_controller.rb中有相同的效果吗? – kakubei 2012-07-16 11:27:35

+0

与appliction_controller.rb一起尝试了它,我得到了以下错误:ApplicationController中的未初始化的类变量@@ model – kakubei 2012-07-16 13:33:50

+0

如果BooksController继承自ApplicationController(或BaseController),那么它如何设置父级使用的变量? – kakubei 2012-07-16 13:45:25