установить постоянные значения для кухни, такие как китайская, индийская в рубине на рельсах - PullRequest
1 голос
/ 21 февраля 2012

Я хочу использовать такие кухни, как (китайский, индийский, американский) в качестве постоянных значений в моем приложении, которые определены в файле конфигурации. Как я могу установить в качестве констант и как получить доступ в контроллерах?

Ответы [ 3 ]

1 голос
/ 21 февраля 2012

Это явно не ответ на ваш вопрос, а предложение, которое вы ищете альтернативы. Я думаю, вам было бы гораздо лучше создать таблицу базы данных с названиями вашей кухни, чем использовать константы. Используйте рельсовые ассоциации, чтобы вы могли писать хороший читаемый код.

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

Используя таблицу базы данных, вы можете убедиться, что класс, связанный с этими константами, всегда находится в согласованном состоянии. Когда вам нужно получить их все, это всего лишь строка кода с

my_cuisines = Cuisine.all

с красивыми встроенными итераторами.

0 голосов
/ 21 февраля 2012

Вы можете использовать гем 'settingslogic'

настройки модели. Rb:

class Settings < Settingslogic
  source "#{Rails.root}/config/settings.yml"
  namespace Rails.env
end

затем используйте в контроллере:

Settings.cousines
0 голосов
/ 21 февраля 2012

Во-первых, подумайте, что сказал Марк Талбот. Убедитесь, что вы действительно не хотите нормальную модель базы данных. Если вы уверены, что хотите использовать константы, продолжайте:

Мой предпочтительный способ сделать это с помощью псевдомодели.

В app/models/cuisine.rb

class Cuisine

  # Should come before the constant declarations
  def initialize(name)
    @name = name
  end

  Mexican = new('Mexican')
  Chinese = new('Chinese')
  Indian = new('Indian')

  def to_s
    name
  end

  # other related methods
  # like translations, descriptions, etc.

end

Тогда в любом другом месте приложения вы можете просто ссылаться на Cuisine::Mexican или Cuisine::Indian

.

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

class Cuisine

  ...

  def self.all
    [Mexican, Indian, Chinese, ...]
  end
end

Этот метод обеспечивает систематизацию кода и не позволяет писать еще один файл инициализатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...