1

さて、あるページの Rails アプリで、Javascript 変数を渡して Rails で使用できるようにする必要がありました。現在、1 つはサーバー側で実行され、もう 1 つはクライアント側で実行されているため、これが非常に難しいことはわかっています。インターネットを調べたところ、外部の JavaScript ページに含まれる関数で動的にフォームを作成するソリューションが見つかりました。

基本的に、ステートメントを使用して非表示フィールドを持つフォームをdocument.createElement作成し、非表示フィールドにレールに渡したい値を指定してからform.submit()、フォームを送信するように呼び出します。フォームには送信方法が指定され、移動先のパスが指定されました。そのため、サブミットすると、呼び出されたページが別のページにリダイレクトされ、隠しフィールドが params ハッシュにあり、Rails でアクセスできるようになりましたparams[:param]

ログインしているユーザーを追跡するためにセッションを使用し始めるまで、これはしばらくの間うまくいきました。その動的フォームでリダイレクトされるボタンをクリックすると、セッションがクリアされます。セッションがクリアされることについて私がオンラインで見つけた唯一のことは、レールがセッションをクリアするCSRFを検出したときです。

それで、私がやっていることがレールにCSRFを検出させ、セッションをクリアさせることができますか? 誰かが知っているセッションがクリアされる可能性がある他の理由はありますか? また、ajaxがないと(私はそれを台無しにするつもりがないので、うまく機能しません。)javascript変数を渡すために欠落している別の良い方法があります(javascriptでなければなりません、私はjavascript関数を使用していますユーザーの現在の場所を取得して、レールで利用できるようにしますか? (私は、フォームを Javascript するのではなく、自分のページに非表示のフォームを作成するだけでよいと考えていますが、ソースを見ている人なら誰でもそれを見て、なぜそこにあるのか疑問に思い、それをねじ込むことができるため、これは少しエレガントではありません)

誰かが興味を持っている場合は、以下が動的フォーム関数のコードです。

function post_to_url(path, params, method) {
method = method || "post"; // Set method to post by default, if not specified.


var form = document.createElement("form");  
form.setAttribute("method", method);
form.setAttribute("action", path);     //page to go redirect to when form submitted


var hiddenField = document.createElement("input");
hiddenField.setAttribute("type", "hidden");

//after form is submitted params is available by params[:location]
hiddenField.setAttribute("name", 'location');     
hiddenField.setAttribute("value", params )

form.appendChild(hiddenField);



document.body.appendChild(form);



form.submit();
}
4

2 に答える 2

1

任意のフォーム リクエストおよび ajax では、CSRF トークンを渡す必要があります。という名前の隠しフィールドをフォームに作成する必要がありますauthenticity_token。次に、メタ タグから値を取得する必要があります。

<meta content="some_token_value" name="csrf-token" />

そのようです:

var token = "";
var tags = document.getElementsByTagName("meta");
for(var i = 0; i < tags.length; i++) { 
  if(tags[i].name == "csrf-param") { 
    token = tags[i].content;
  }
}

次に、場所の値で行ったのと同じように、それを hidden タグの値にドロップします。

于 2012-10-22T18:09:58.810 に答える
0

javascriptファイルにerb行を追加できます。

var csrf_token = '<%= form_authenticity_token %>';

'authenticity_token' : csrf_token次に、リクエストに投稿データを追加します。

于 2012-10-22T18:28:58.150 に答える