У меня есть пользовательский контроллер, который выглядит следующим образом:
class Api::V1::UsersController < ApiController
include ActionController::HttpAuthentication::Token::ControllerMethods
before_action :find_user, only: [:show]
before_action :authenticate, only: [:destroy]
...
def destroy
if @user
@user.destroy
else
render json: { user: "not found" }, status: :not_found
end
end
private
...
def authenticate
authenticate_with_http_token do |token, options|
@user = User.find_by(token: token)
end
end
end
И у меня также есть этот тест
describe "DELETE #destroy" do
before(:each) do
@user = FactoryBot.create :user
request.env['HTTP_AUTHORIZATION'] = @user.token
delete :destroy, params: { id: @user.id }
end
it { should respond_with 204 }
end
Каждый раз, когда я запускаю bundle exec rspec
этот точный тест метода уничтожения сбой: Это происходит из-за метода authenticate_with_http_token
. Я передаю токен в заголовок HTTP_AUTHORIZATION, но метод authenticate_with_http_token
не видит этот токен. Я изменил метод authenticate
в контроллере так:
def authenticate
@user = User.find_by(token: request.headers['HTTP_AUTHORIZATION'])
end
И тест проходит нормально, все работает. Но я не думаю, что явное извлечение токена из request.headers
является правильным подходом, и я хотел бы придерживаться authenticate_with_http_token
. Что мне делать, чтобы authenticate_with_http_token
заработал нормально?