2014-05-21 1 views
4

내 API가 action 매개 변수가 포함 된 POST를 보내는 외부 소스에서 콜백을 처리 중입니다. 이 매개 변수는 레일 작업을 함께 할 수 없다, 그냥 같은 이름이 될 일이 :Rails에서 "action"매개 변수가있는 POST 처리

param1=value1&action=example&param2=value2 

을이 레일을 명중 할 때, 레일 (이 경우 create에서) 액션의 이름으로 매개 변수를 무시합니다. .. 그래서 얻을 :

{ action: 'create', param1: 'value1', params2: 'value2' } 

어떻게 깨끗한 방법으로 원래의 action 매개 변수를 액세스 할 수 있습니까? 못생긴

Rack::Utils.parse_query(request.raw_post)["action"] 

... 더 나은 아무것도 : 현재 나는 raw_post을 구문 분석해야?

답변

0

매개 변수에 작업이있는 요청을 가로 채고 전달하기 전에 이름을 바꾸는 랙 미들웨어를 만들 수 있습니다.

나는이 같은 보일 것이다 믿습니다

class ActionParamRenamer 
    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    # you might want to only do this for certain paths 
    if env["rack.request.form_hash"] && env["rack.request.form_hash"]["action"] 
     env["rack.request.form_hash"]["action_param"] = env["rack.request.form_hash"].delete("action") 
    end 
    if env["rack.request.form_vars"] && env["rack.request.form_vars"].match(/[\?&]action\=/) 
     env["rack.request.form_vars"].gsub!(/([\?&])action\=/, /\1action_param=/) 
    end 
    @app.call(env) 
    end 
end 

을하고 난 당신이 설정/초기화/action_renamer.rb이를 추가하거나 그러나 요즘 레일에서 작동하는 것 같아요

Rails::Initializer.run do |config| 
    config.middleware.use "ActionParamRenamer" 
end 
관련 문제