使用Rails强参数反序列化Json-Api

Deo*_*ski 20 active-model-serializers

我在使用EsonCLI和Rails时使用Active Model Serializers 0.10.x,同时尝试将Json-Api作为适配器.GET请求正在努力,但反序列化的活动模型甚至没有,虽然我试图落实jimbeaudoin描述的轨道strong_parameters解决方案在这里.

我保存评论的最新尝试:

有效载荷:

{"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"}}
Run Code Online (Sandbox Code Playgroud)

控制台输出:

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

评论控制器:

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
Run Code Online (Sandbox Code Playgroud)

注意到如果我将参数设置为只有params.permit(...),服务器会将所有内容保存为null(我现在没有在注释模型上设置任何约束):

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"
Run Code Online (Sandbox Code Playgroud)

您可以在此处访问完整代码.

Deo*_*ski 12

更新#2:对于AMS> = 0.10.2,请检查其他答案.

更新#1:答案仍然适用于AMS 0.10.1.

如果使用0.10.0.rc4,则现在可以使用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
Run Code Online (Sandbox Code Playgroud)

额外奖励:如果您使用Ember Data,那么您可以在我的Fakktion Github仓库上看到示例实现.


小智 8

对于AMS> = 0.10.2

在0.10.2中进行了清理,因此在0.10.2之后使用:

def post_params
   ActiveModelSerializers::Deserialization.jsonapi_parse(params)
end
Run Code Online (Sandbox Code Playgroud)

参考:https: //github.com/rails-api/active_model_serializers/commit/252f9c4ae932e6280dfe68605d495b208fe22ba7

  • 还有一种方法可以实现白名单`ActiveModelSerializers :: Deserialization .jsonapi_parse(仅限文档:[:title,:date,:author],keys:{date :: publish_at},polymorphic:[:author])` (5认同)

Lor*_*lor 7

使用AMS 0.10.2+

使用onlyhash创建参数白名单,

def post_params
  ActiveModelSerializers::Deserialization.jsonapi_parse!(
    params, only: [:title, :author, :tags]
  )
end
Run Code Online (Sandbox Code Playgroud)