2014-08-27 31 views
8

Wprowadzam proste API w mojej aplikacji do komunikacji z aplikacją na Androida. Próbuję użyć AbstractController :: Metal głównie dla wydajności. Problem, który mam, polega na tym, że render ignoruje opcję statusu, którą przechodzę.Rails 4 AbstractController :: Renderowanie metalu ze statusem! = 200 (tj. 401, 404)

Bardzo prosty przykład:

class Api::V1::ApiController < ActionController::Metal 
    include AbstractController::Rendering 
    include ActionController::Renderers::All 
    include ActionController::RackDelegation 
    include ActionController::MimeResponds 
end 

class Api::V1::SessionsController < Api::V1::ApiController 
    def show 
    render status: :unauthorized # using 401 yields the same result 
    end 
end 

Wywołanie

curl -v -X GET http://app.dev:3000/api/v1/sessions.json 

będę oczekiwać, aby otrzymać 401 ale zamiast ja dostaję 200 OK:

> GET /api/v1/sessions.json HTTP/1.1 
> User-Agent: curl/7.30.0 
> Host: app.dev:3000 
> Accept: */* 
> 
< HTTP/1.1 200 OK 

jakieś pomysły? Nadpisywanie pliku response.status jest jedyną pracą, jaką udało mi się znaleźć, ale szczerze wygląda na to, że to brzydki hack.

Z góry dziękujemy za uwagi.

+0

jesteś pewien, że '/ api/v1/sessions.json' przechodzi do akcji akcji 'show'? a także wygląda zamiast 'statusu renderowania:: nieautoryzowane' powinno być 'renderuj nic: prawda, status: 401' – IS04

+0

@ IS04 Tak, to pokazuje, ponieważ na moich trasach mam zasób: sesje (zamiast zasobu ** s * *). Próbowałem również renderować nic i otrzymałem taki sam wynik (jeśli chodzi o status, ciało odpowiedzi było puste). –

+1

Mam ten sam problem z ActionController :: Metal - wszelkie spostrzeżenia, które na nim odkryłeś? – Michael

Odpowiedz

0

użycie head ActionController::Head

class Api::V1::SessionsController < Api::V1::ApiController 
    def show 
    head :unauthorized 
    end 
end 
0

miałem ten sam problem z kodem pokazanym przykładzie poniżej. To była praca z ActionController::Metal w Rails 3 i zaczął braku po uaktualnieniu do Rails 4.2.4:

# config/routes.rb 
get :unauthorized, to: 'unauthorized#respond'  

# app/controllers/unauthorized_controller.rb 
class UnauthorizedController < ActionController::Metal 
    def respond 
    head :forbidden 
    end 
end 

# spec/controllers/unauthorized_controller_spec.rb 
describe UnauthorizedController do 
    it 'should respond with 403 forbidden' do 
    get :respond, {}, {} 

    expect(response.status).to be == 403 
    end 
end 

Test upadających po uaktualnieniu. Tak aby rozwiązać ten musiałem zmienić

class UnauthorizedController < ActionController::Metal

do

class UnauthorizedController < ActionController::Base

1

Aby uczynić nic i powrót kod 401 zastosowanie:

render nothing: true, status: :unauthorized