我想有一種單獨的列表,在單獨的模塊中初始化,然後可以包含在控制器中並在控制器級別修改,並在控制器訪問 - 實例級別。我認爲類變量可以在這裏工作,但是有些奇怪的事情正在發生,他們似乎沒有在我的結局類中被初始化。類變量和模塊包含,特別是在ActionController
更具體地說:
我有很多控制器都包括一些默認功能,一個模塊中。
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是一個糟糕的電話,但我想不出還有什麼我可能會使用。 (一個類實例變量?)
請注意,我希望@sorts是類級別的,而不是實例級別。見下面我最終使用的答案。 我在我的問題中忽略了任何self.included()調用的原因 - 包含子模塊時,實例和類變量變得非常髒。因此,我將您的方法轉換爲DefaultFunctionality,從而有效地消除導致無法解決的頭痛的子模塊問題。 – 2010-03-03 23:11:28
我同意聲明中的默認設置,我只是希望人們知道數據結構是什麼樣的。就像現在看來的那樣,我應該在宣言的一邊評論它。 – 2010-03-03 23:12:50
在我的原始代碼中,我製作了單獨的SortOrder對象,因此有了make_sorts!在[order,dir,name]數組和SortOrder.new(order,dir,name)之間進行轉換的方法很有用。很顯然,情況並非如此。我已經修改了我的答案,以包含您的self.sorts風格;這個例子似乎是最好的。 – 2010-03-03 23:15:32