wake-up-neo.net

Starke Parameter JSON-API-Schienen

Ich arbeite an einer REST -API in Rails 4.2 und möchte das Format JSON API respektieren. Meine params sind wie folgt:

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

Ich habe versucht, eine Methode für starke Parameter wie diese 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, steht dort title and description parameters not permitted [Mein Artikelmodell hat Titel und Beschreibung]. Kannst du mir helfen?

14
kitz

Der Umgang mit JSONAPI-Parametern unterscheidet sich nur geringfügig vom Umgang mit den üblichen Rails-Parameter-Hashes:

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

Als Erstes sollten Sie hier feststellen, dass wir nicht einmal den params[:data][:id]-Schlüssel aus den JSON-Daten verwenden, da die ID über die Anforderungs-URL (params[:id]) verfügbar ist. Wenn Sie RESTful-Mustern folgen, müssen Sie wahrscheinlich nie den Parameter params[:data][:id] verwenden.

In article_attributes verwenden wir verschachtelte Require-Aufrufe, da Rails einen ActionController::ParameterMissing-Fehler auslösen soll, es sei denn, die angegebenen JSON-Daten bestätigen die JSON-API-Spezifikation. Standardmäßig rettet Vanilla Rails mit einer 400-Bit-Request-Antwort. - RailsAPI gibt 422 und ein JSON-Fehlerobjekt zurück, wenn es ordnungsgemäß für JSONAPI eingerichtet ist.

17
max

Ich denke, der beste Weg, dies jetzt zu erreichen, ist:

hinzugefügt

gem 'active_model_serializers' 

in dein Gemfile

und dies auf Ihrem Controller

ActiveModelSerializers::Deserialization.jsonapi_parse(params)

bonus Griff Dash 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"}
2
Joel AZEMAR

Sie können auch eine json: api-Bibliothek verwenden, die Deserialisierungsfunktionen bietet, z. B. http://jsonapi-rb.org , sodass Sie sich nicht direkt mit dem json: api-Format befassen müssen. In diesem Zusammenhang würde Ihr Beispiel lauten:

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

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

   # ...
 end
0
beauby