【问题标题】:Deserializing Json-Api with Rails Strong Parameters使用 Rails 强参数反序列化 Json-Api
【发布时间】:2015-09-10 00:58:26
【问题描述】:

我正在使用带有 EmberCLI 和 Rails 的 Active Model Serializers 0.10.x,同时尝试将 Json-Api 作为适配器。 GET 请求正在工作,但即使我尝试实现 jimbeaudoin here 描述的 rails 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"}}

控制台输出:

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

评论控制器:

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

请注意,如果我将参数设置为仅 params.permit(...),服务器会将其保存为空值(我暂时没有对 cme​​ts 模型设置任何约束):

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"

您可以访问完整代码here

【问题讨论】:

  • 你解决了这个问题吗?

标签: active-model-serializers


【解决方案1】:

更新 #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

奖励:如果您使用 Ember Data,那么您可以在我的 Fakktion Github repo 上看到一个示例实现。

【讨论】:

  • 嘿@Deovandski,我正面临与处理破折号相关的问题。如您所知,ember 发送类似 starts-at 的参数,而 rails api 需要 stars_at。基于文档:github.com/rails-api/active_model_serializers/blob/v0.10.6/docs/…
  • 我尝试使用这样的键选项:ruby ActiveModelSerializers::Deserialization.jsonapi_parse!(params, only: %i[name description type url continuous starts_at finishes_at], keys: { 'starts-at': :starts_at, 'finishes-at': :finishes_at }) 我也尝试了params.to_unsafe_h,但仍然无法正常工作。有什么想法吗?
  • 抱歉,sn-p 格式不佳。看来cmets不能做得更好了。
  • 你好!自从我上次接触 Ruby on Rails 或 AMS 以来已经有几年了,所以我真的无法再帮忙了,因为我忘记了大部分内容...... AMS 似乎仍然存在于最新版本的 v0.10.12 中,所以也许您应该创建一个新的 StackOverflow 问题,然后在 AMS Github 上创建一个链接到它的问题。这样,您可能会引起 AMS 维护者之一的注意。
  • 嗨,谢谢您的回复!我设法通过链接to_unsafe_hdeep_transform_keys 来解决它:)
【解决方案2】:

对于 AMS >= 0.10.2

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

def post_params
   ActiveModelSerializers::Deserialization.jsonapi_parse(params)
end

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

【讨论】:

  • 好的,这是反序列化,但它实际上是在做白名单吗?我不相信它是。这不是绕过了强参数的整个想法吗?
  • 有一种方法仍然可以实现白名单ActiveModelSerializers::Deserialization .jsonapi_parse(document, only: [:title, :date, :author], keys: { date: :published_at }, polymorphic: [:author])
【解决方案3】:

使用 AMS 0.10.2+

使用only哈希创建参数白名单,

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

【讨论】:

    【解决方案4】:

    对于谷歌员工:

    如果你有空的数据负载,你需要添加 Mime 支持 https://stackoverflow.com/a/32013294/2664779

    当你想访问json-api格式的json时,你应该这样做 (在你的控制器中)

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

    以前我会这样做

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

    【讨论】:

    • 手动注册 Mime 导致 Rails 输出“警告:已初始化常量 Mime::JSON”和“警告:JSON 的先前定义在这里。”在终端上......虽然rails停止说Data为空并开始接受属性参数,但所有关系参数都没有保存。您知道解决此问题的方法吗?
    • @Deovandski 对你来说可能有点晚了,但这可能是你正在寻找的解决方法(欧比万说):stackoverflow.com/questions/35733430/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 2018-11-02
    • 2023-03-14
    • 2018-05-04
    • 2021-01-22
    • 1970-01-01
    相关资源
    最近更新 更多