постоянные значения в Rails - PullRequest
21 голосов
/ 12 декабря 2008

У меня есть некоторые данные, которые я хочу сохранить где-нибудь в своем приложении Rails, потому что я использую их для генерации полей формы, проверки отправленной формы, чтобы убедиться, что ее значения действительны, и т. Д. В основном, я хочу, чтобы данные были в одном месте, потому что я использовать его в нескольких местах.

Ранее я определял метод initialize в своем контроллере и инициализировал переменные экземпляра в этом методе, например, @graph_types = ['bar', 'line']. Это казалось плохой идеей, потому что на самом деле это все, что initialize использовалось для (инициализации этих значений), а переменные экземпляра могли быть изменены позже, чего я не хочу.

Теперь я определяю константы вне любого метода в моем контроллере, прямо вверху после моих фильтров, и замораживаю их, например. GraphTypes = ['bar', 'line'].freeze.

Я не хотел хранить такие данные в конфигурационном файле, потому что тогда мне пришлось бы отслеживать дополнительный файл, читать его, анализировать и т. Д. Я не хотел сохранять эти данные в база данных, потому что это кажется излишним; Мне не нужно делать никаких сумасшедших запросов типа LEFT OUTER JOIN, комбинирующих доступные типы графов с другой из моих констант, скажем Themes = ['Keynote', 'Odeo', '37 Signals', 'Rails Keynote'].freeze. Я не хотел хранить данные в environment.rb, потому что эти данные относятся только к определенному контроллеру.

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

Ответы [ 6 ]

29 голосов
/ 13 декабря 2008

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

  class StaticData

    GRAPH_TYPES = ['bar', 'line']

    SOMETHING_ELSE = ['A', 'B']

  end

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

StaticData::GRAPH_TYPES
11 голосов
/ 10 ноября 2011

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

Помещение константы в контроллер имеет некоторый смысл, так как константа имеет к ней непосредственное отношение. В противном случае константы должны быть помещены в специальный файл инициализатора: 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.

9 голосов
/ 12 декабря 2008

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

4 голосов
/ 12 декабря 2008

Да, то, что вы делаете, хорошо. Тем не менее, более логично, что Ruby называет вашу константу GRAPH_TYPES.

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

3 голосов
/ 18 июня 2009

Я бы согласился кое-что с IDBD и Paradisepete. Лучше всего использовать константы в модели, чтобы контроллер был худым, а модель - толстой. см. Rails, советы по просмотру Например, если у вас был контроллер метрик, связанный с моделью метрик. В метрической модели класс Metric

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

f.select: graph_type, Metric :: GRAPHTYPES

1 голос
/ 12 декабря 2008

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

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

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

...