Автоматически устанавливать созданные_байлы на модели при использовании устройства - PullRequest
1 голос
/ 23 марта 2020

Я пытаюсь автоматически установить created_by в моих моделях для аутентифицированного пользователя без явной передачи пользователя в качестве аргумента. Я использую devise для аутентификации и для настройки пользователя глобально при каждом запросе. Я использую новые rails api ActiveSupport::CurrentAttributes, например, так:

# app/models/current.rb

class Current < ActiveSupport::CurrentAttributes
  attribute :user
end

# config/initializers/warden.rb

Warden::Manager.after_set_user { |user, auth, opts| Current.user = user }

Тогда у меня Owned беспокойство

# app/models/concerns/owned.rb

module Owned
  extend ActiveSupport::Concern

  included do
    belongs_to(
      :created_by,
      class_name: "User",
      foreign_key: "created_by_id",
      default: -> { Current.user }
    )
  end
end

, который включен в модели, в которых я хочу автоматически установить created_by.

Это работает, но недавно я получил ошибку, в которой created_by был назначен не тому человеку, и мне интересно, может ли это быть вызвано кодом, который я описал выше, потому что это не потокобезопасно. Я не могу воспроизвести ошибку снова, и я не знаю, как проверить на такие потенциальные условия гонки. Итак, мои вопросы: правильно ли я использую CurrentAttributes и мой код в целом? Есть ли лучший способ, как автоматически установить created_by?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...