在我的模型中的rails初始值设定项中获取变量

时间:2016-09-29 11:02:26

标签: ruby-on-rails activesupport

我需要访问config / initializers / myFile.rb中的变量,在我的模型中,我在此文件中有一个ActiveSupport订阅方法

ActiveSupport::Notifications.subscribe "deliver.action_mailer" do |name, started, finished, unique_id, data|

::EstablishmentRoutingHashes = the_hash_route

end

我想在我的模型中访问此变量

class Establishment < ActiveRecord::Base
    EstablishmentRoutingHashes // want to use it in here
end

但是我在EstablishmentsController #create中收到此错误 NameError 未初始化的常数建立:: EstablishmentRoutingHashes

我用另一种仪器做了这个并且它有效,不同的是这个来自我在我的一个控制器中的自定义仪器事件

def create
 ActiveSupport::Notifications.instrument("create.application", @payload_hash)
end

你能告诉我如何解决这个错误吗?

1 个答案:

答案 0 :(得分:0)

::EstablishmentRoutingHashes是常数。您应该只为常量赋值一次。多次触发deliver.action_mailer,因此您会看到多个警告,例如warning: already initialized constant ...。但这不是导致错误的原因。

显示您的错误NameError in EstablishmentsController#create uninitialized constant Establishment::EstablishmentRoutingHashes,因为当您的Rails-App启动时未定义此常量。它将在第一次执行subscribe块的代码时定义。

当你使用像sidekiq这样的异步传递方法或simalar之类的东西时,它会变得更糟,因为这个块在作业中被调用而不是Rails-App。

即使是像puma这样的多线程服务器也会遇到竞争条件。

我认为您需要一种不同的方法来解决您的初始问题。

你必须做一些事情:

ActiveSupport::Notifications.subscribe "deliver.action_mailer" do |name, started, finished, unique_id, data|

   new_establishment = Establishment.find_or_create ...
   establishment.execute_an_action the_hash_route

end