Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: KaranОтветов: 3

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

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

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

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

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

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

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

NameError:
       uninitialized constant Provider
  • Уже даны ответы на очень похожие вопросы: stackoverflow.com/questions/10607063/ jstim 23.05.2012
  • суть в том, чтобы помещать константы в контекст, в котором они необходимы. Они нужны в конкретном классе или внутри environment.rb, если они нужны везде. jstim 23.05.2012
  • stackoverflow.com/questions/ 10438647/ jstim 23.05.2012

ruby-on-railsconstants

Ответы

Ответ 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)

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы