2016-09-29 1 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' опечатку? Это две разные константы. Унииализованная константа - это 'RoutingHash' в классе' Учреждение'. Но вы используете константу 'InstallmentRoutingHashes' – slowjack2k

+0

Я просто изменил имя константы, просто чтобы сделать ее немного описательной. – Teebo

+0

Я отредактировал мой вопрос, чтобы включить фактическую ошибку, извините за это – Teebo

ответ

0

::EstablishmentRoutingHashes постоянная. Вы должны назначить значение только один раз константе. deliver.action_mailer запускается несколько раз, поэтому вы увидите несколько предупреждений, таких как warning: already initialized constant .... Но это не причина вашей ошибки.

Ваша ошибка NameError in EstablishmentsController#create uninitialized constant Establishment::EstablishmentRoutingHashes отображается, потому что эта константа не определена при запуске Rails-приложения. Он будет определен при первом выполнении кода для блока subscribe.

Когда вы используете методы доставки async, такие как 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

Im пытается использовать InstallmentRoutingHash константа, чтобы удерживать некоторое количество от – Teebo

+0

Я пытаюсь использовать константу CreatementRoutingHash для хранения некоторых данных из полезной нагрузки инструмента события «deliver.action_mailer» и отправить его в мою модель, я хочу сделать это для каждого события «deliver.action_mailer», которое произойдет в приложении, что вы говорите, что константа на самом деле верна, я не понимаю другого объяснения и кода внизу – Teebo

+0

В принципе у вас проблема параллелизма. Вы не можете использовать глобальное состояние (например, глобальную переменную) для передачи информации вам/записи/модели. Wihtin в потоковой среде глобальное состояние может быть изменено одновременно с несколькими угрозами, и вы не получите ожидаемого результата. Работой раунд может быть «Thread.current». Но это не работает, если вы используете внешний ActiveJob, такой как sidekiq. Потому что в этом случае это не только другая угроза, это внешний процесс. Лучше всего вы обрабатываете все вещи в блоке 'subscribe'. – slowjack2k