2011-02-17 10 views
4

私はそれがRailsに達する前にauthenticity_tokenパラメータを変更するいくつかのミドルウェアをやっています。ラックとrack.request.form_vars/rack.request.form_hash

env.inspectがrack.request.form_varsとrack.request.form_hashの両方を提供していることがわかります。どちらも真正性トークンを含んでいます。 Railsはどちらを使用しますか?

+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

ソースを見て、ソースを理解することは2つの異なることです:)そのことを説明してくれてありがとう。 – 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に持続しますと同じように

- それはあなたのような状況に対処するためのより高いレベルの呼び出しです。

関連する問題