2017-07-14 60 views
0

在我的Rails API中,我添加了一个初始化程序,它将JSON输入的键从snake-case改为下划线分隔。像这样:Rails:ActionDispatch :: Request.parameter_parsers for multipart/form-data

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) 
} 

现在,某些API将与标头中传递:中application/jsoncontent-type: multipart/form-data代替

我想为这样的API做同样的。这是添加一个初始化程序,它将转换参数中键的大小写。我试过ActionDispatch::Request.parameter_parsers[:form_data]但它不起作用。

我该如何做到这一点?

+0

你有没有设法解决这个问题?我添加了一个解析器,如下面的答案中所建议的,但是它打开了一堆蠕虫:( –

+0

是的,我做过了,有点,我无法使用'parameters_parsers'工作,它只是无法工作适用于JSON参数让我通过添加它作为答案来展示我的代码 – mridula

回答

1

当你看DEFAULT_PARSERS时,它使用Mime类,所以我们最终使用的任何东西都可能需要被Mime类识别。所以我们可以检查Mime::Types看看有什么可用的。

在该页面上,我们看到content-type: multipart/form-data映射到:multipart_form。事实上,虽然使用

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

然后提交表单与文件字段,我可以触发错误。

0

尽管根据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 
+0

此解决方案适用于Rails 5,但存在弃用警告,但Rails 5.1从params中删除了deep_transform_keys!,所以它不是一个好的长期解决方案,以及我们可能需要修改 'ActionDispatch :: Request.parameter_parsers [:multipart_form] = - >(raw_post){' –