Постоянные значения в Rails
У меня есть некоторые данные, которые я хочу хранить где-то в моем приложении Rails, потому что я использую его для создания полей формы, проверки представленной формы, чтобы убедиться, что ее значения действительны и т.д. В принципе, я хочу, чтобы данные были в одном месте, потому что я использовать его в нескольких местах.
Раньше я определял метод initialize
в моем контроллере и инициализировал переменные экземпляра в этом методе, например. @graph_types = ['bar', 'line']
. Это показалось плохой идеей, потому что в действительности все initialize
использовались для (инициализации этих значений), и переменные экземпляра могли быть изменены позже, чего я не хочу.
Теперь я определяю константы вне любого метода в моем контроллере, прямо вверху после моих фильтров, и я замораживаю их, например. GraphTypes = ['bar', 'line'].freeze
.
Я не хотел хранить такие данные в файле конфигурации, потому что тогда мне пришлось бы отслеживать дополнительный файл, читать в файле и анализировать его и т.д. Я не хотел хранить эти данные в потому что это похоже на избыток; Мне не нужно делать какие-либо сумасшедшие запросы типа LEFT OUTER JOIN, сочетающие доступные типы графиков с другими моими константами, например Themes = ['Keynote', 'Odeo', '37 Signals', 'Rails Keynote'].freeze
. Я не хотел хранить данные в environment.rb, потому что эти данные относятся только к определенному контроллеру.
Учитывая все это, я собираюсь об этом "Ruby way"?
Ответы
Ответ 1
Я считаю, что то, что вы сейчас делаете, прекрасно; вы сказали, что данные относятся только к одному контроллеру и, следовательно, к тому, где он принадлежит. Если это необходимо для нескольких контроллеров, или если они были более сложными, чем постоянные значения, то другие подходы могут иметь смысл.
Ответ 2
Для констант, которые на самом деле не принадлежат нигде, у меня есть класс StaticData.
class StaticData
GRAPH_TYPES = ['bar', 'line']
SOMETHING_ELSE = ['A', 'B']
end
Тогда я получаю на нем
StaticData::GRAPH_TYPES
Ответ 3
Тот же ответ я писал ранее на аналогичный вопрос, применяется и публикуется, так как этот ответ по-прежнему появляется в результатах поиска.
Помещение константы в контроллер имеет смысл, поскольку константа относится непосредственно к ней. В противном случае константы должны быть помещены в выделенный файл инициализации: Rails.root/config/initializers/constants.rb
.
В соответствии с комментарием, указанным в приложении .rb:
# Application configuration should go into files in config/initializers
# -- all .rb files in that directory are automatically loaded
Это все еще актуально с Rails 3.
Ответ 4
Да, то, что вы делаете, прекрасно. Это более идиоматический Ruby, чтобы назвать ваш постоянный GRAPH_TYPES
, хотя.
Кстати, я бы не стал определять initialize
в ваших контроллерах. Похоже, это может привести к неприятностям.
Ответ 5
Я бы согласился с тем, что с IDBD и paradisepete. Использование констант в модели было бы лучшим способом, чтобы контроллер был тощим и модельным жиром. см. Советы по просмотру Rails
Например, если у вас есть метрический контроллер, связанный с метрической моделью. В метрической модели
класс Метрика < ActiveRecord:: Base GRAPHTYPES = ['bar', 'line']
Тогда в представлении вы можете сделать что-то вроде
f.select: graph_type, Metric:: GRAPHTYPES
Ответ 6
Если вы создаете формы, относящиеся к некоторому ресурсу, то это хороший вариант для хранения в моделях. Вам не нужно хранить его в БД, потому что это могут быть простые переменные/методы класса или экземпляра.
То же самое касается проверки. Если вы проверяете экземпляры ресурсов/моделей, тогда будет разумным выбор для хранения параметров проверки внутри класса модели.
В любом случае, он будет намного ближе к шаблону "толстая модель и тонкий контроллер", а затем к любому из вариантов, которые вы упомянули.