2015-01-23 11 views
8

otrzymuje następujące Rails 4.2 Kontroler:odpowiedzieć statusu nieuprawnionym (401) z szynami 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 

Kiedy z RSpec 3, staram się wywołać tę index działań i oczekiwać, aby mieć status 401 Zawsze mają status 200.

jedyny moment, w którym mam 401 ma zastąpić zawartość index działania z head 401 ale chciałbym odpowiedzieć z błędem 401, a także zbudować „nice” ciało jak { error: 401, message: 'Unauthorised' }.

Dlaczego ignoruje się status: :unauthorised?

+0

Właśnie zbudował szybką aplikację testową a Spec przechodzi. Prawdopodobnie będzie to kolejny 'before_filter' lub' before_action', jak sugeruje @shoji. –

+0

Mam dokładnie ten sam problem z Railsami 4.2.0 i Rspec-rails 3.3 – diffeomorphism

Odpowiedz

5

musiałem zastąpić mój kontroler z tym następujący:

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 

Korzystanie render nie uniemożliwia wywoływany akcja do wykonania. Użycie head :unauthorized zwraca prawidłowy kod stanu, ale z pustym ciałem.

Z self.status i self.response_body działa idealnie.

Widać zajrzeć do kodu źródłowego moja perełka gdzie miałem ten problem tutaj: https://github.com/YourCursus/fortress

+0

Próbowałem tego, ale stan odpowiedzi nadal wynosi 200 – diffeomorphism

0

Wymień unauthorised przez unauthorized

+0

Przepraszam ... autokorekta z OSX. Nie działa z "nieautoryzowanym". – ZedTuX

+0

Naprawdę nie rozumiem, dlaczego to nie działa ... Z RSpec robię 'get: index, format:: json', a następnie' expected (response.status) .to eql (401) 'ale ja wszystkie czas ma 200 kodów. – ZedTuX

+0

Jakiego pliku specyfikacji używasz, żądania, kontrolera itp.? I nie masz 'before_filter' lub' before_action' w 'ApplicationController'? – shoji

6

kodu Wykorzystanie błędu zamiast niej nazwa: render json: {}, status: 401

+0

Obydwa są równoważne w Railsach, spójrz na [przewodniki] (http://guides.rubyonrails.org/layouts_and_rendering.html#the-status-option). Ponadto, całkowita gramatyka nazi: ['its'] (http://www.its-not-its.info/) –

+0

Angielski nie jest moim ojczystym językiem, więc używam kodów, aby uniknąć błędów –

+0

@AlexTonkonozhenko Próbowałem już tego i to nie działa. – ZedTuX

Powiązane problemy