Rails:带有lib模块的NameError

时间:2016-02-28 13:51:39

标签: ruby-on-rails ruby-on-rails-4

在我的设备模型中,我尝试在lib类上调用类方法,但在生产中我得到了

NameError (uninitialized constant Device::Push):

它适用于发展。

但我不会调用Device :: Push类。而不是我在我的设备模型中所做的事情:

class Device < ActiveRecord::Base
  ...
  after_update :send_notifications
  ...
  def send_notifications
    Push::NotificationFactory.send(device: self) if (self.push_token_changed? && ! self.push_token.nil?)
  end
end

在lib / push / notification_factory.rb中,应该调用以下类:

module Push
  class NotificationFactory
    def self.send(device: )
      n = Rpush::Apns::Notification.new
      n.app = Rpush::Apns::App.find_by_name(Rails.configuration.x.app['push']['app_name'])
      n.device_token = device.push_token
      n.alert = 'Welcome to PrizeArena!'
      n.save!
    end
  end
end

这是我收到的错误消息:

2016-02-28T13:40:51.407542+00:00 app[web.1]: NameError (uninitialized constant Device::Push):
2016-02-28T13:40:51.407543+00:00 app[web.1]:   app/models/device.rb:77:in `send_notifications'
2016-02-28T13:40:51.407544+00:00 app[web.1]:   app/controllers/api/v1/users_controller.rb:44:in `update'

如果有人可以指出NameError的来源,那会很棒。

2 个答案:

答案 0 :(得分:0)

  

NameError(未初始化的常量Device :: Push)

您需要使用includemodule中嵌入class

class Device < ActiveRecord::Base

  include Push
  ...
  after_update :send_notifications
  ...
  def send_notifications
    Push::NotificationFactory.send(device: self) if (self.push_token_changed? && ! self.push_token.nil?)
  end
end

答案 1 :(得分:0)

我想出了为什么它在开发方面有效但在生产方面没有用的问题。

我在自动加载路径中添加了lib,但需要将其添加到eager_load_path。

您需要添加

*_sended.txt

到application.rb

问题只发生在生产上,而不是发展上,因为生产Rails默认情况下eager_loads环境。

更多信息: http://blog.arkency.com/2014/11/dont-forget-about-eager-load-when-extending-autoload/