2008-12-11 3 views
21

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

Принимая во внимание все это, собираюсь ли я об этом «рубиновом пути»?

ответ

9

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

4

Да, что вы делаете, это нормально. Это более идиоматический Ruby, чтобы назвать ваш постоянный GRAPH_TYPES.

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

1

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

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

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

27

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

class StaticData 

    GRAPH_TYPES = ['bar', 'line'] 

    SOMETHING_ELSE = ['A', 'B'] 

    end 

Тогда я получаю на него с

StaticData::GRAPH_TYPES 
+2

Где вы положили класс? Вы находите его в своих моделях? – ahsteele 2009-10-01 02:22:38

+3

Ну, я помещаю его в каталог моделей, но, вероятно, лучше поместить его в lib. – user37011 2009-10-02 14:58:35

3

Я согласен, что некоторые с IDBD и paradisepete. Использование констант в модели было бы лучшим способом, чтобы контроллер был тощим и модельным жиром. см. Rails view tips Например, если у вас есть метрический контроллер, связанный с метрической моделью.В метрической модели класса Метрика < ActiveRecord :: Base GRAPHTYPES = [ 'бар', 'строка']

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

f.select: graph_type, Metric :: GRAPHTYPES

11

Тот же ответ I wrote previously to a similar question применяется и публикуется, так как этот ответ по-прежнему появляется в результатах поиска.

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

This is still valid as of Rails 3.

Смежные вопросы