постоянные значения в 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, потому что эти данные относятся только к определенному контроллеру.

Учитывая все это, я пойду по этому «Рубиновому пути»?

11.12.2008 22:30:10
6 ОТВЕТОВ
РЕШЕНИЕ

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

9
11.12.2008 23:03:16

Да, то, что вы делаете, хорошо. Это более идиоматичный Руби, чтобы называть вашу константу GRAPH_TYPESвсе же.

Кстати, я бы не стал определять initializeв ваших контроллерах. Похоже, это может привести к неприятностям.

4
18.04.2016 17:51:09

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

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

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

1
12.12.2008 16:53:32

Для констант, которые на самом деле нигде не принадлежат, у меня есть класс StaticData.

  class StaticData

    GRAPH_TYPES = ['bar', 'line']

    SOMETHING_ELSE = ['A', 'B']

  end

Тогда я получаю это с

StaticData::GRAPH_TYPES
30
13.12.2008 02:45:42
Где вы положили класс? Вы находите это в своих моделях?
ahsteele 1.10.2009 02:22:38
Ну, я помещаю его в каталог моделей, но, вероятно, было бы лучше поместить его в lib.
user37011 2.10.2009 14:58:35

Я бы согласился кое-что с IDBD и Paradisepete. Лучше всего использовать константы в модели, чтобы контроллер был худым, а модель - толстой. см. советы по просмотру Rails Например, если у вас был контроллер метрик, связанный с моделью метрик. В метрической модели класса Metric <ActiveRecord :: Base GRAPHTYPES = ['bar', 'line']

Тогда в представлении вы могли бы сделать что-то вроде

f.select: graph_type, Metric :: GRAPHTYPES

3
18.06.2009 10:19:21

Тот же ответ, который я написал ранее на аналогичный вопрос, относится и к публикации, так как этот ответ все еще появляется в результатах поиска.

Размещение константы в контроллере имеет некоторый смысл, поскольку константа имеет к ней непосредственное отношение. Константы должны иначе быть помещены в специальный файл инициализации: Rails.root/config/initializers/constants.rb.

Согласно комментарию, указанному в application.rb:

# Application configuration should go into files in config/initializers
# -- all .rb files in that directory are automatically loaded

Это все еще действует на Rails 3.

11
23.05.2017 12:09:11
Саша, какую область вы используете для определения констант в вашем config/initializers/constants.rbфайле? Вы помещаете это MAGIC_NUMBER = 42в глобальную область видимости, заключаете ее в module YourAppблок или что-то еще?
evanrmurphy 6.03.2012 20:50:05
@evanrmurphy, решать только вам. Заключение ваших констант в пространство имен наиболее безопасно для предотвращения конфликтов имен, а также добавляет дополнительный контекст при использовании констант, но некоторые люди предпочитают не использовать пространство имен (то есть глобальную область видимости).
Dennis 20.10.2014 13:58:36