Подтвердить что ты не робот

Постоянные значения в 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"?

4b9b3361

Ответ 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

Если вы создаете формы, относящиеся к некоторому ресурсу, то это хороший вариант для хранения в моделях. Вам не нужно хранить его в БД, потому что это могут быть простые переменные/методы класса или экземпляра.

То же самое касается проверки. Если вы проверяете экземпляры ресурсов/моделей, тогда будет разумным выбор для хранения параметров проверки внутри класса модели.

В любом случае, он будет намного ближе к шаблону "толстая модель и тонкий контроллер", а затем к любому из вариантов, которые вы упомянули.