serializers rails new fast_jsonapi fast active active-model-serializers

active-model-serializers - new - rails gem serializer



Deserialización de Json-Api con parámetros fuertes de Rails (4)

Estoy usando Active Model Serializers 0.10.x con EmberCLI y Rails mientras trato de tener el Json-Api como adaptador. Las solicitudes GET están funcionando, pero la deserialización para el modelo activo no funciona aunque intenté implementar la solución de parámetros fuertes de rieles descrita here jimbeaudoin.

Mi último intento de guardar un comentario:

Carga útil:

{"data":{ "attributes": {"soft_delete":false,"soft_delete_date":null,"text":"hjfgfhjghjg","hidden":false,"empathy_level":0}, "relationships":{ "user":{"data":{"type":"users","id":"1"}}, "post":{"data":{"type":"posts","id":"1"}}},"type":"comments"}}

Salida de consola:

Completed 400 Bad Request in 13ms (ActiveRecord: 8.6ms) ActionController::ParameterMissing (param is missing or the value is empty: data):

Comentarios Controlador:

class Api::V1::CommentsController < MasterApiController respond_to :json ... def create render json: Comment.create(comment_params) end ... def comment_params #Deserialization issues... Waiting for #950 https://github.com/rails-api/active_model_serializers/pull/950 params.require(:data).require(:attributes).permit(:text, :user_id, :post_id, :empathy_level, :soft_delete_date, :soft_delete, :hidden) end end

Notando que si configuro los parámetros solo para params.permit (...) , el servidor lo guarda con todo nulo (por ahora no configuré ninguna restricción en el modelo de comentarios):

data: {id: "9", type: "comments",…} attributes: {soft_delete: null, soft_delete_date: null, text: null, hidden: null, empathy_level: null} id: "9" relationships: {post: {data: null}, user: {data: null}} type: "comments"

Puedes acceder al código completo here .


Actualización # 2: Para AMS> = 0.10.2, verifique otras respuestas.

Actualización # 1: la respuesta sigue siendo válida para AMS 0.10.1 .

Si usa 0.10.0.rc4 , ahora puede usar la implementación de Deserialización descrita en Active Model Serializers #1248 .

def post_params ActiveModel::Serializer::Adapter::JsonApi::Deserialization.parse(params.to_h) // or (params.to_unsafe_h) in some cases like in my example below... end

Bono: si usa Ember Data, entonces puede ver una implementación de ejemplo en mi here .


Para los googlers:

Si tiene una carga útil de datos vacía, debe agregar el soporte de Mime https://.com/a/32013294/2664779

Cuando quiera acceder a json-api formateado json, debe hacerlo así (en su controlador)

def create user = User.new(user_params) ... end private def user_params params.require(:data).require(:attributes).permit(:email, :password) end

Cuando antes lo haría así.

private def user_params params.require(:user).permit(:email, :password) end


Con AMS 0.10.2+

Utilice only hash para crear una lista blanca de parámetros,

def post_params ActiveModelSerializers::Deserialization.jsonapi_parse!( params, only: [:title, :author, :tags] ) end