代码之家  ›  专栏  ›  技术社区  ›  mridula

Rails:ActionDispatch::请求。多部分/表单数据的参数分析器

  •  2
  • mridula  · 技术社区  · 9 年前

    在我的rails API中,我添加了一个初始化器,将JSON输入的键从snake-case更改为下划线分隔。像这样:

    ActionDispatch::Request.parameter_parsers[:json] = -> (raw_post) {
        data = ActiveSupport::JSON.decode(raw_post)
        data = {:_json => data} unless data.is_a?(Hash)
    
        data.deep_transform_keys!(&:underscore)
    }
    

    content-type: multipart/form-data 而不是 application/json

    我想对这样的API也这么做。也就是说,添加一个初始化器,该初始化器将转换参数中键的大小写。

    ActionDispatch::Request.parameter_parsers[:form_data] 但它不起作用。

    我怎样才能做到这一点?

    2 回复  |  直到 9 年前
        1
  •  4
  •   Simple Lime    9 年前

    当你看到 DEFAULT_PARSERS ,它使用 Mime 哑剧表演 班我们可以查一下 Mime::Types 看看有什么可用的。

    content-type: multipart/form-data 映射到 :multipart_form

    ActionDispatch::Request.parameter_parsers[:multipart_form] = -> (raw_post) {
      raise "Parsing Parameters: #{raw_post}"
    }
    

    然后提交一个带有文件字段的表单,我可以触发错误。

        2
  •  0
  •   mridula    9 年前

    虽然根据Simple Lime的回答, :multipart_form content-type: multipart/form-data ,它的工作方式与JSON不同。

    这是我实施的工作:

    class ApplicationController < ActionController::API
        before_action :transform_params_if_multipart!
    
        private 
        def transform_params_if_multipart!
            params.deep_transform_keys!(&:underscore) if /^multipart\/form-data*/.match(request.headers['content-type'])
        end
    end