2016-09-29 55 views
0

我需要訪問配置/初始化/ 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 

訪問此變量,但我得到這個錯誤NameError在EstablishmentsController#創建 未初始化的不斷建立:: EstablishmentRoutingHashes

我這樣做是與其他儀器和它的工作,什麼不同的是,這一次來自於我在我的控制器中的一個自定義的儀器事件

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

你們可以給我如何一個方向解決這個錯誤。

+0

是'建立:: RoutingHash'或'EstablishmentRoutingHashes'一個錯字?這是兩個不同的Constantes。 uniitialized常量是'Establishment'類中的'RoutingHash'。但你使用常量'EstablishmentRoutingHashes' – slowjack2k

+0

我只是改變了常數名稱,只是爲了使它有點描述 – Teebo

+0

我已編輯我的問題,包括實際的錯誤,對不起 – Teebo

回答

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 
+0

我試着使用EstablishmentRoutingHashes常量來保存從 – Teebo

+0

我正在嘗試使用EstablishmentRoutingHashes常量來保存來自「deliver.action_mailer」事件工具負載的一些數據並將其發送到我的模型,我想爲應用程序中將發生的每個「deliver.action_mailer」事件執行此操作,你說關於常數是真的,我不明白其他的解釋和底部的代碼 – Teebo

+0

基本上你有一個併發問題。您不能使用全局狀態(如全局變量)將信息傳輸到您的記錄/模型。在線程化環境中,全局狀態可以同時從多個威脅中更改,並且不會得到預期的結果。一輪的工作可以是'Thread.current'。但是當你使用像sidekiq這樣的外部ActiveJob時它不起作用。因爲在這種情況下,它不僅是另一個威脅,而且是外部過程。最好你在'subscribe'塊中處理所有事情。 – slowjack2k