在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
有什么想法吗?谢谢