Я хочу иметь какой-то единственный список, который инициализируется в отдельном модуле, затем может быть включен в контроллер и изменен на уровне класса контроллера и доступен на контроллере уровень. Я думал, что переменные класса будут работать здесь, но что-то странное происходит, кажется, что они не инициализируются в моем конечном классе.переменные класса и включение модуля, в частности в 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 плохой вызов, но я не могу думать о том, что еще я мог бы использовать. (экземпляр класса var?)
Обратите внимание, что я хотел, чтобы @sorts был уровнем класса, а не уровнем экземпляра. Ниже приведен ответ, который я использовал. Причина, по которой я оставил любые вызовы self.included() в моем вопросе - экземпляры и переменные класса становятся действительно грязными при включении подмодулей. Поэтому я даю вам повышение, поскольку вы переместили методы в DefaultFunctionality, эффективно удалив проблему подмодуля, которая вызывает невыразимые головные боли. –
Я согласен с дефолтами в декларации, я просто хотел, чтобы люди знали о том, как выглядела структура данных. Я должен был прокомментировать это в сторону декларации, как сейчас. –
В моем исходном коде я делал отдельные объекты SortOrder, поэтому с make_sorts! метод для преобразования между массивами [order, dir, name] и SortOrder.new (order, dir, name) был полезен. Очевидно, здесь это не так. Я изменил свой ответ, включив стиль self.sorts; это лучше всего подходит для примера. –