我想要某种在单独的模块中初始化的单一列表,然后可以包含在控制器中并在控制器类级别进行修改,并在控制器实例级别进行访问。我认为类变量可以在这里工作,但是发生了一些奇怪的事情,它们似乎没有在我的结束类中被初始化。
进一步来说:
我有很多控制器,都包括一些默认功能,在一个模块中。
class BlahController < ApplicationController
include DefaultFunctionality
end
class FooController < ApplicationController
include DefaultFunctionality
end
module DefaultFunctionality
def show
render 'shared/show'
end
def model
controller_name
end
end
, 例如。这不是实际的代码,但这是目前最多的交互。
我想用其他一些功能(列表的可排序接口)来扩展它,就像这样[注意我希望能够逐个类地交换排序顺序列表功能]:
module DefaultFunctionality
module Sortable
def sort_params
params.slice(:order, :sort_direction).reverse_merge(default_sort_params)
end
def default_sort_params
@@sorts.first
end
def set_sorts(sorts = []) #sorts = [{:order => "most_recent", :sort_direction => :desc},...]
@@sorts = sorts
end
end
include Sortable
set_sorts([{:order => :alphabetical, :sort_direction => :asc}] #never run?
end
这个想法是为了确保我能够逐个类地交换所有可能的排序集,如下所示:
class FooController < ApplicationController
include DefaultFunctionality #calls the default set_sorts
set_sorts([{:order => :most_recent, :sort_direction => :asc}])
end
并且还要在视图中建立很好的链接,如下所示,除了我遇到错误。
___/blah/1 => shared/show.html.erb__
<%= link_to("upside down", polymorphic_path(model, sort_params) %><%#BOOOM uninitialized class variable @@sorts for BlahController %>
我认为 class_var 是一个糟糕的调用,但我想不出我还能使用什么。(类实例变量?)