2015-01-23 2 views
8

Учитывая следующие Rails 4.2 Контроллер:Ответить с состоянием неавторизованного (401) с Rails 4

class Api::UsersController < ApplicationController 
    def index 
    respond_to do |format| 
     format.html do 
     flash[:error] = 'Access denied' 
     redirect_to root_url 
     end 
     format.json do 
     render json: {}, status: :unauthorised 
     end 
    end 
    end 
end 

Когда с RSpec 3, я пытаюсь вызвать эту index действие и ожидают иметь статус 401 Я всегда имеет статус 200.

единственный момент, когда я получил 401, чтобы заменить содержимое index действия с head 401, но я хотел бы ответить с ошибкой 401, а также создать «хорошее» тело как { error: 401, message: 'Unauthorised' }.

Почему игнорируется status: :unauthorised?

+0

Я только что построил быстрое приложение тестирования и ваш спецификации проходит. Вероятно, это будет еще один 'before_filter' или' before_action', как предлагает @shoji. –

+0

У меня такая же проблема с Rails 4.2.0 и Rspec-rails 3.3 – diffeomorphism

ответ

5

Я должен был заменить мой контроллер с этим следующее:

class Api::UsersController < ApplicationController 
    def index 
    respond_to do |format| 
     format.html do 
     flash[:error] = 'Access denied' 
     redirect_to root_url 
     end 
     format.json do 
     self.status = :unauthorized 
     self.response_body = { error: 'Access denied' }.to_json 
     end 
    end 
    end 
end 

Использование render не препятствует вызываемая действие должно быть выполнено. Использование head :unauthorized возвращает правильный код состояния, но с пустым телом.

С self.status и self.response_body он отлично работает.

Вы можете увидеть, посмотрите на исходный код мой драгоценный камень, где я имел этот вопрос здесь: https://github.com/YourCursus/fortress

+0

Я пробовал это, но статус ответа еще 200 – diffeomorphism

0

Заменить unauthorised на unauthorized

+0

Извините ... автокоррекция из OSX. Он не работает с 'unauthorized'. – ZedTuX

+0

Я действительно не понимаю, почему он не работает ... С RSpec я делаю 'get: index, format:: json', а затем' expect (response.status) .to eql (401) ', но я все время имеет код 200. – ZedTuX

+0

Какой файл спецификации вы используете, запрос, контроллер и т. Д.? И, разве у вас нет 'before_filter' или' before_action' в 'ApplicationController'? – shoji

6

кода Использование ошибок вместо него это имя: render json: {}, status: 401

+0

Эти два эквивалента в Rails, посмотрите на [руководства] (http://guides.rubyonrails.org/layouts_and_rendering.html#the-status-option). Кроме того, общая грамматика nazi: ['its'] (http://www.its-not-its.info/) –

+0

Английский не мой родной язык, поэтому я использую коды, чтобы избежать ошибок –

+0

@AlexTonkonozhenko Я уже пробовал это и он не работает. – ZedTuX

Смежные вопросы