Я родом из Java. Мне было интересно, есть ли способ иметь класс, в котором хранятся постоянные значения.
Что касается моей проблемы, мне было интересно, могу ли я иметь что-то вроде:
@user.authentications.create(:uid => "12345", :provider => Provider::FACEBOOK)
где класс Provider хранит все статические константы. Кроме того, правильно ли это сделать в Ruby on Rails?
Дополнительная информация: я пробовал вышеописанное, имея
class Provider
FACEBOOK = "facebook"
TWITTER = "twitter"
end
но выдало ошибку:
NameError:
uninitialized constant Provider
Ответ 1 · рейтинг 1 · forker
Вариант 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)
Ответ 2 · jstim
Если вы хотите сохранить реализацию выше
Попробуйте поставить перед Provider::FACEBOOK двойное двоеточие.
::Provider::FACEBOOK
Это устанавливает абсолютный путь, поэтому Ruby не пытается искать константу внутри текущего контекста/класса/контроллера. (Я предполагаю, что прямо сейчас он думает, что константа определена в UserController::Provider::FACEBOOK)
Больше в стиле Rails
Был ряд других сообщений о том, где размещать константы, поэтому, пожалуйста, ознакомьтесь:
По сути, размещайте константы там, где они вам действительно нужны. Либо в контроллере/модели, либо в environment.rb, если вы хотите получить к ним доступ везде.
Ответ 3 · Sandip Mondal
Если вы объявите этот класс в файле модели, он будет доступен. Если вы объявляете в файле lib, вы должны добавить одну строку в свой файл application.rb
config.autoload_paths += %W(#{config.root}/lib)