2016-02-08 3 views
0

Я вновь открыт класс драгоценного камня в моих рельсах приложении, кажется, что все будет хорошо, все идет хорошо, но через несколько минут, кажется, что мое приложение забыло все модификации:Rails настроить класс Gem

конфигурации/Инициализаторы/rapidfire_custom.rb

::Rapidfire::Survey.class_eval do 

    belongs_to :campaign, class_name: '::Campaign', inverse_of: :survey 

    before_create :default_active 
    before_validation :default_status, :default_name 

    STATUS = ['DRAFT', 'PUBLISHED'] 
    validates_inclusion_of :status, in: STATUS 
    validates :name, presence: true 

    scope :from_company, -> (id) { where(company_id: id) } 
    scope :template, -> { where(campaign_id: nil) } 
    scope :published, -> { where(status: 'PUBLISHED') } 

    def default_active 
    self.active ||= true 
    end 

    def default_status 
    self.status ||= 'DRAFT' 
    end 

    def self.all_status 
    STATUS 
    end 

    def default_name 
    if self.campaign 
     self.name = 'Survey' 
    end 
    end 

end 

ошибка:

undefined method `template' for #<Rapidfire::Survey::ActiveRecord_AssociationRelation:0x007fc762215ad0> 

Это происходит только на развитие, я использую пума:

конфигурации/puma.rb

workers Integer(ENV['WEB_CONCURRENCY'] || 2) 
threads_count = Integer(ENV['MAX_THREADS'] || 5) 
threads threads_count, threads_count 

preload_app! 

rackup  DefaultRackup 
port  ENV['PORT']  || 3000 
environment ENV['RACK_ENV'] || 'development' 

if ENV['RACK_ENV'].nil? || ENV['RACK_ENV'] == 'development' 
    ssl_bind 'my_website.dev', '3000', { key: 'ssl/device.key', cert: 'ssl/device.crt' } 
end 

on_worker_boot do 
    ActiveRecord::Base.establish_connection 
    $redis.client.reconnect 
end 

Я не знаю, что происходит, любая идея?

Благодаря

+1

Есть ли какая-то причина, по которой вы обезьяна, исправляя класс, а не просто подклассифицируя его? – max

+0

Я использовал наследование, как вы мне предложили, и он работает хорошо. Но я до сих пор не понимаю, почему это не работает с моим прецедентом. – Ayoros

ответ

2

Я предполагаю, что когда ActiveRecord конкретизирует Rapidfire::Survey записи он загружает класс из драгоценного камня - опрокидывающего изменения, которые вы сделали с классом Eval в инициализаторе.

Объекты, которые не принадлежат вам, должны быть выполнены только в том случае, если вам необходимо переопределить библиотечный метод, и нет лучшего способа.

Вы также должны учитывать, когда и где происходит класс eval - инициализаторы запускаются при загрузке приложения rails, когда классы моделей ленивы загружаются, когда им требуется ActiveRecord. Поэтому использование инициализатора для настройки модели - не очень хорошая идея.

Использование наследования - правильная вещь здесь - вы создаете свой собственный объект домена.