2011-02-17 3 views
4

레일스에 도착하기 전에 authenticity_token 매개 변수를 변경하는 일부 미들웨어를 수행하고 있습니다.랙 및 rack.request.form_vars/rack.request.form_hash

env.inspect는 rack.request.form_vars와 rack.request.form_hash를 모두 제공합니다. 두 가지 모두 진위도 토큰을 포함합니다. 레일스는 어느 것을 사용합니까? 그리고 랙이 두 가지를 모두 제공하는 이유는 무엇입니까?

+0

이 사실을 알고 싶습니다. 너가 무엇이든을 발견하면 나에게 알려줘. – iain

+0

레일 소스 트리에서'form_vars'와'form_hash'를 검색해도 결과가 나타나지 않으므로 레일스는 둘 중 하나를 사용하지 않는다고 제안합니까? 나는 너처럼 혼란 스럽다. –

답변

7

출처를 살펴 봅시다! 두 변수는 Rack::Request 도우미 클래스를 사용하여 생성됩니다. 요청 매개 변수에 대한 좋은 인터페이스를 제공합니다. Rack 응용 프로그램에서 사용할 필요는 없지만 Rails에서는이를 사용합니다.

변수는 Rack::Request 님의 내부 용입니다. rack.request.form_vars에는 분석되지 않은 POST 본문이 포함되고 rack.request.form_hash에는 구문 분석 된 해시가 포함됩니다. ActionDispatch::RequestRack::Request에서 상속 받고 후자 변수를 읽는 Rack::Request#POST을 사용하여 매개 변수를 가져옵니다. Rack::Request을 사용하여 수정할 수 있습니다.

+1

소스를보고 소스를 이해하는 데는 두 가지 다른 점이 있습니다. :) 설명해 주셔서 감사합니다. – iain

3

당신이 this pull request을 포함 랙의 최근 사본이있는 경우

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

    def call(env) 
    req = Rack::Request.new(env) 
    req.POST["authenticity_token"] = "foo" 
    end 
end 
, 당신이 사용할 수있는 Rack::Request#update_param :

request = Rack::Request.new(env) 
request.update_param :auth_token, 'XXXXXXXXXXXXXXXX' 
위의 req.POST 솔루션은이 미들웨어 사이에 전달되는 env에 유지됩니다 것처럼

- 그러나 그것은 당신 같은 상황을 다루기위한 높은 수준의 호출입니다.

관련 문제