Хранить константы в Rails

Я родом из Java. Мне было интересно, есть ли способ иметь класс, в котором хранятся постоянные значения.

Что касается моей проблемы, мне было интересно, могу ли я иметь что-то вроде:

@user.authentications.create(:uid => "12345", :provider => Provider::FACEBOOK)

где класс Provider хранит все статические константы. Кроме того, правильно ли это сделать в Ruby on Rails?

Дополнительная информация: я пробовал вышеописанное, имея

class Provider
  FACEBOOK = "facebook"
  TWITTER = "twitter"
end

но выдало ошибку:

NameError:
       uninitialized constant Provider

person Karan    schedule 22.05.2012    source источник
comment
Уже даны ответы на очень похожие вопросы: stackoverflow.com/questions/10607063/   -  person jstim    schedule 23.05.2012
comment
суть в том, чтобы помещать константы в контекст, в котором они необходимы. Они нужны в конкретном классе или внутри environment.rb, если они нужны везде.   -  person jstim    schedule 23.05.2012
comment
stackoverflow.com/questions/ 10438647/   -  person jstim    schedule 23.05.2012


Ответы (3)


Вариант 1 (переменные класса):

class Provider
  @@FACEBOOK = "facebook"
  @@TWITTER = "twitter"
end

@user.authentications.create(:uid => "12345", :provider => Provider.FACEBOOK)

Однако в некоторых случаях использование переменных класса настоятельно не рекомендуется. Лучшим способом было бы использовать мета-вуду:

class Provider
  @FACEBOOK = "facebook"
  @TWITTER = "twitter"

  class << self
    attr_reader :FACEBOOK, :TWITTER
  end
end

@user.authentications.create(:uid => "12345", :provider => Provider.FACEBOOK)
person forker    schedule 22.05.2012

Если вы хотите сохранить реализацию выше

Попробуйте поставить перед Provider::FACEBOOK двойное двоеточие.

::Provider::FACEBOOK

Это устанавливает абсолютный путь, поэтому Ruby не пытается искать константу внутри текущего контекста/класса/контроллера. (Я предполагаю, что прямо сейчас он думает, что константа определена в UserController::Provider::FACEBOOK)

Больше в стиле Rails

Был ряд других сообщений о том, где размещать константы, поэтому, пожалуйста, ознакомьтесь:

По сути, размещайте константы там, где они вам действительно нужны. Либо в контроллере/модели, либо в environment.rb, если вы хотите получить к ним доступ везде.

person jstim    schedule 22.05.2012

Если вы объявите этот класс в файле модели, он будет доступен. Если вы объявляете в файле lib, вы должны добавить одну строку в свой файл application.rb

config.autoload_paths += %W(#{config.root}/lib)
person Sandip Mondal    schedule 23.05.2012