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
Para AMS> = 0.10.2
En 0.10.2 se realizó una limpieza, por lo que después del uso de 0.10.2:
def post_params
ActiveModelSerializers::Deserialization.jsonapi_parse(params)
end
Referencia: https://github.com/rails-api/active_model_serializers/commit/252f9c4ae932e6280dfe68605d495b208fe22ba7