2017-07-14 56 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){' –