2

В основном у меня есть initializer class на RAILS_ROOT/config/initialiers/app_constant.rb, чтобы все было легко контролировать.Рельсы: Запустите инициализатор перед созданием классов

class AppConstant 
    APIURL = 'http://path.to.api' 
end 

И в RAILS_ROOT/model/user.rb, у меня есть настройки:

class User < ActiveResource::Base 
    self.site = AppConstant::APIURL 
end 

И при запуске rails s, я получил следующее сообщение об ошибке

<class:User>: uninitialized constant User::AppConstant::APIURL 

Я знаю, что проблема в том, что Rails работать Инициализаторы после создания классов. Есть ли способ сделать некоторые инициализаторы запущенными до того, как Rails настроит его классы?


Наконец эта проблема решается путем добавления require "#{Rails.root}\conf\initializers\app_constant.rb" к application.rb, который загружается непосредственно перед моделями Rails нагрузок.

ответ

3

Чтобы запустить код до загрузки Rails, поместите его выше require 'rails/all' в config/application.rb.

+0

Спасибо за ваш ответ, я пробовал с глобальной областью '::', но это не сработало. Проблема в том, что когда Rails генерирует класс 'User', класс' AppConstant' не инициализируется. Но я не знаю, как сделать класс 'AppConstant' инициализированным до того, как он прочитает класс' User' – jwall

+0

Обновлено мой ответ – DanS

+0

Вы правы, наконец, я должен сделать этот способ, чтобы решить проблему. – jwall

0

Другим решением было бы обернуть константу в методе так не оценивается при загрузке класса, но только позже, когда вызывается метод:

def self.site 
    AppConstant::APIURL 
end 

Если она должна быть настраиваемой, а также :

def self.site=(url) 
    @site = url 
end 

def self.site 
    @site ||= AppConstant::APIURL 
end 
Смежные вопросы