Как мне использовать обратный вызов типа before_action с ActiveModel::Model?

#ruby-on-rails #ruby #activerecord

#ruby-on-rails #ruby #activerecord

Вопрос:

У меня есть модель базы данных, в которой фактически нет никаких данных, поскольку вся моя информация о пользователе хранится в сторонней службе аутентификации. Я хочу иметь возможность использовать модель как обычную, поэтому при загрузке я извлекаю всю информацию из API и сохраняю ее в переменной экземпляра.

Как мне настроить before_action обратный вызов like для моей модели? Есть ли способ Ruby сделать это?

 class Auth0User < ApplicationRecord
  before_action set_instance_variables

  validates :auth0_id, presence: true,
                       uniqueness: true

  def info(key = nil)
    key.nil? ? @user : @user[key.to_s]
  end

  private

  def set_instance_variables
    @user ||= auth0_api.user auth0_id
  end

  def auth0_api
    Auth0Client.new(
      client_id: Rails.application.secrets.auth0_client_id,
      token: Rails.application.secrets.auth0_management_jwt,
      domain: Rails.application.secrets.auth0_domain,
      api_version: 2
    )
  end
end
  

Комментарии:

1. dockyard.com/blog/2013/08/20/design-patterns-observer-pattern

2. guides.rubyonrails.org/active_record_callbacks.html

Ответ №1:

after_intialize делает именно то, что мне было нужно.

Ответ №2:

Да, и на самом деле у rails было много методов на выбор:

  • before_save
  • before_create
  • before_destroy

Вы можете проверить здесь дополнительные методы: http://guides.rubyonrails.org/active_record_callbacks.html

Комментарии:

1. К сожалению, в этом контексте ни один из них не будет работать. Вопрос заключается в настройке переменной экземпляра из стороннего хранилища данных, которая не может быть сохранена в нашей собственной БД. Следовательно, after_initialize это единственный обратный вызов, который устанавливает переменные экземпляра. Те, которые вы перечислили, не срабатывают при загрузке модели из базы данных.