使用find_or_create_by!在before_action过滤器中

时间:2018-10-08 16:02:11

标签: ruby-on-rails-5.2

User.find_or_create_by!过滤器中使用before_action时,我的行为很奇怪:

class ApplicationController < ActionController::API

before_action :authorize_request

attr_reader :current_user

  private

  def authorize_request
    @current_user = (AuthorizeApiRequest.new(request.headers).call)[:user]
  end
end

然后在AuthorizeApiRequest中,我正在检查是否存在或通过名称创建新用户:

class AuthorizeApiRequest
  def initialize(headers = {})
    @headers = headers
  end

  def call
    {
      user: user
    }
  end

def user
    if decoded_auth_token && decoded_auth_token[:sub]
      @user ||= User.find_or_create_by!(username: decoded_auth_token[:sub])
      Rails.logger.silence do
        @user.update_column(:token, http_auth_header)
      end
      @user
    end
  rescue ActiveRecord::RecordInvalid => e
    raise(
      ExceptionHandler::InvalidToken,
      ("#{Message.invalid_token} #{e.message}")
    )
  end
end

UsersController的示例:

class UsersController < ApplicationController

  def me
    if user_info_service.call
      json_response current_user, :ok, include: 'shop'
    else
      raise AuthenticationError
    end
  end

  private

  def user_info_service_class
    @user_info_service_class ||= ServiceProvider.get(:user_info_service)
  end

  def user_info_service
    @user_info_service ||= user_info_service_class.new(user: current_user)
  end
end

怪异是什么,有时用户使用相同的用户名创建两次,有时却没有。 我在前面使用Ember JS,并在通过JWT进行身份验证后立即对shops进行了另一个调用。所有路由均受保护。我的印象是,调用current_user并不总是像这样的线程或某事物,它会导致拥有2个相同的用户: -第一个只设置了用户名属性的 -具有其他所有User属性的另一个。

这是User模型:

class User < ApplicationRecord
validates :username, presence: true, uniqueness: { case_sensitive: false }, on: :create
  validates :shop_identifier, numericality: { only_integer: true, greater_than: 0 }, on: :update
  validates :first_name, presence: true, on: :update
  validates :last_name, presence: true, uniqueness: { case_sensitive: false, scope: :first_name }, on: :update

  before_update do |user|
    user.first_name = first_name.strip.capitalize
    user.last_name = last_name.strip.upcase

end

有什么想法吗?谢谢

0 个答案:

没有答案