2014-08-27 13 views
8

Ich implementiere eine einfache API in meiner Anwendung, um mit einer Android-Anwendung zu kommunizieren. Ich versuche, AbstractController :: Metal hauptsächlich für die Performance zu verwenden. Das Problem, das ich habe, ist, dass Render die Statusoption ignoriert, die ich übergebe.Rails 4 AbstractController :: Metall-Rendering mit Status! = 200 (d. H. 401, 404)

Sehr einfaches Beispiel:

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 

Aufruf

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

ich erwarten würde ein 401 zu erhalten, sondern bekomme ich eine 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 

Irgendwelche Ideen? Das Überschreiben von response.status ist die einzige Arbeit, die ich bisher gefunden habe, aber ehrlich gesagt sieht es wie ein hässlicher Hack aus.

Vielen Dank im Voraus für Ihre Erkenntnisse.

+0

sind Sie sicher, dass '/ api/v1/sessions.json' geht zu deiner Aktion 'show' action? und sieht auch so aus statt 'render status:: unauthorized' sollte' render nothing sein: true, status: 401' – IS04

+0

@ IS04 Ja es wird angezeigt, weil ich in meinen routen resource: sessions habe (statt ressource ** s * *). Ich habe auch versucht, nichts zu rendern und habe das gleiche Ergebnis (bezüglich des Status, der Körper der Antwort war leer). –

+1

Ich habe das gleiche Problem mit ActionController :: Metal - irgendwelche Erkenntnisse, die Sie darauf entdeckt haben? – Michael

Antwort

0

Verwendung head ActionController::Head

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

Ich hatte das gleiche Problem mit dem Beispiel-Code unten. Dies war mit ActionController::Metal in Rails arbeiten 3 und begann nach 4.2.4 zu Rails Upgrade Fehler:

# 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 

Der Test nach dem Upgrade versagte. Also, diese zu lösen hatte ich

class UnauthorizedController < ActionController::Metal

zu

class UnauthorizedController < ActionController::Base

1

nichts ändern zu machen und Code 401 Verwendung zurück:

render nothing: true, status: :unauthorized