2015-07-23 16 views
13

Ich arbeite an einer REST-API in Rails 4.2 und ich möchte JSON API Format respektieren. Meine params wie diese sind:Starke Parameter JSON API-Schienen

{ 
    "data":{ 
    "type": "articles", 
    "id": "1", 
    "attributes": { 
     "title": "this is title", 
     "description": "This is description" 
    } 
} 

Ich habe versucht, ein Verfahren zur starken params wie folgt zu schreiben:

def article_params 
    params.require(:data).permit(:id, attributes: [:title, :description]) 
end 

aber wenn ich versuche Article.update_attributes(article_params) zu tun, sagt sie title and description parameters not permitted [Mein Artikel Modell hat Titel und Beschreibung ]. Kannst du mir helfen?

+0

Versuchen Sie, diese 'params.require (: data) .permit (: id, Titel,: Beschreibung)' – Pavan

+0

ich jetzt versucht. Derselbe Fehler :(Ich kann nicht herausfinden, wo das Problem liegt ... – kitz

+0

@Pavan überprüfen, ob die [JSONAPI spec] (http://jsonapi.org/) Attribute in einen attriubtes Hash eingeschlossen werden sollen – max

Antwort

14

mit JSONAPI params Der Umgang ist nur etwas anders als mit den üblichen Schienen params-Hashes zu tun:

class ArticlesController < ApiController 

    before_filter :set_article, only: [:show, :edit, :update, :destroy] 

    # POST /api/v1/articles 
    def create 
    @article = Article.new(article_attributes) 
    # ... 
    end 

    # PATCH /api/v1/articles/:id 
    def update 
    @article.update(article_attributes) 
    # ... 
    end 

    # ... 

    private 

    def set_article 
    @article = Article.find(params[:id]) 
    end 

    def article_attributes 
    params.require(:data) 
      .require(:attributes) 
      .permit(:title, :description) 
    end 
end 

Das erste, was Sie hier bemerken sollte, ist, dass wir nicht gar params[:data][:id] Schlüssel aus dem JSON-Daten verwenden, da Die ID ist über die Anfrage-URL verfügbar (params[:id]). Wenn Sie RESTful-Patterns folgen, besteht die Wahrscheinlichkeit, dass Sie nie den Parameter verwenden müssen.

In article_attributes verwenden wir verschachtelte Require-Aufrufe, weil wir möchten, dass Rails einen ActionController::ParameterMissing Fehler auslösen, wenn die angegebenen JSON-Daten die JSON-API-Spezifikation bestätigen. Der Vanilla-Rails-Standard wird mit einer 400 Bad Request-Antwort gerettet - RailsAPI wird 422 und ein JSON-Fehlerobjekt zurückgeben, wenn es für JSONAPI richtig eingerichtet ist, was wir wollen.

+1

In einem Projekt, an dem ich gerade arbeite, überprüfe ich auch, ob der Parameter data [: type] mit dem richtigen Typ übereinstimmt, und gebe 422 zurück, wenn dies nicht der Fall ist. – max

+0

Sollte es "erlauben" oder "erlauben" sein? Ich habe versucht zu erlauben und Schienen sagte, es gab keine solche Methode namens erlauben. – Zhang

+0

Es sollte "Erlaubnis" sein, es war ein Fehler meinerseits. – max

0

Sie können auch eine json: api-Bibliothek verwenden, die Deserialisierungsfunktionen wie http://jsonapi-rb.org bietet, so dass Sie nicht direkt mit dem json: api-Format arbeiten müssen. In diesem Zusammenhang möchte Ihr Beispiel lesen:

class ArticlesController < ApiController 
    deserializable_resource :article, only: [:create, :update] 

    def article_params 
    params.require(:article).permit(:title, :description) 
    end 

    # ... 
end 
+0

Kannst du den Link der Dokumentation oder des Online-Codes bekommen, wo genau 'ApiController' herkommt? –

2

ich die beste Art und Weise denke, das jetzt zu erreichen ist:

hinzugefügt
gem 'active_model_serializers' 

zu Ihrem Gemfile

und diese auf Ihrem Steuerung

ActiveModelSerializers::Deserialization.jsonapi_parse(params) 

Bonus Griff Strich für Sie.

params = { "data": { 
    "attributes": { 
     "title": "Bucket List", 
     "created-by": "John Doe" 
    }, 
    "type": "todos" 
    } 
} 
params = ActionController::Parameters.new(params) 
ActiveModelSerializers::Deserialization.jsonapi_parse(params) 
=> {:title=>"Bucket List", :created_by=>"John Doe"} 
+0

Ja, aber die Parameter werden nicht auf die weiße Liste gesetzt. Welches ist das Thema der Frage? – max

Verwandte Themen