2014-08-27 9 views
8

Sto implementando una semplice API nella mia applicazione per comunicare con un'applicazione Android. Sto cercando di usare AbstractController :: Metal principalmente per le prestazioni. Il problema che sto avendo è che il rendering sta ignorando l'opzione di stato che sto passando.Rails 4 AbstractController :: Metal rendering con stato! = 200 (vale a dire 401, 404)

esempio molto semplice:

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 

Calling

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

mi aspetto di ricevere un 401, ma invece ho un 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 

Tutte le idee? Sovrascrivere response.status è l'unico lavoro che ho trovato fino ad ora, ma onestamente sembra un brutto scherzo.

Grazie in anticipo per i vostri approfondimenti.

+0

Sei sicuro di '/ api/v1/sessions.json' va alla tua azione 'show' action? e sembra invece di 'render status:: non autorizzato 'dovrebbe essere' render nulla: true, stato: 401' – IS04

+0

@ IS04 Sì, va a mostrare perché nei miei percorsi ho risorse: sessioni (invece di risorse ** s * *). Ho anche provato a rendere nulla e ottenere lo stesso risultato (per quanto riguarda lo stato, il corpo della risposta era vuoto). –

+1

Sto avendo lo stesso problema con ActionController :: Metal - eventuali approfondimenti che hai scoperto su di esso? – Michael

risposta

0

uso head ActionController::Head

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

Ho avuto lo stesso problema con il codice di esempio riportato di seguito. Questo è stato lavorare con ActionController::Metal in Rails 3, e ha iniziato non riuscendo dopo l'aggiornamento a 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 

La prova è stata fallendo dopo l'aggiornamento. Quindi, per risolvere questo ho dovuto cambiare

class UnauthorizedController < ActionController::Metal

a

class UnauthorizedController < ActionController::Base

1

Per rendere nulla e tornare codice 401 uso:

render nothing: true, status: :unauthorized 
Problemi correlati