2011-12-14 7 views
5

JSONで応答するコントローラにいくつかのAjax呼び出しをしようとしています。RailsレンダリングJSON - セッションが失われましたか?

if session[:user] 
    render :json => "Some Data" 
else 
    render :json => "You are not logged in" 
end 

このアクションはauthedユーザーすべてによって呼び出される最初の時間は大丈夫ですとsession[:user]!= nilです。 2度目に呼び出されるのはnilです!

それで、レールがすぐにセッションを失っているようです。render :json。私は最初の呼び出しのレールの中で*_session - 新しいものとクッキーを無効にすることを理解しました。そのレールの結果として、最初の、authed、セッションについては知りません。

私が応答をJSONとしてレンダリングしないと、すべて正常に動作します。

JSONレンダリングされたページで、通常のビューと同じセッションIDを設定するにはどうすればよいですか?

+0

(この方法では、すべてのAjaxリクエストにbeforeSendを追加する必要があります)あなたはAJAX要求の他の方法を使用する必要がない場合は

function goAjax(urlAddress,dataObject,successFunction,errorFunction){ $.ajax({ type: "POST", url: urlAddress, beforeSend: function (xhr) { xhr.setRequestHeader("X-CSRF-Token", $('meta[name=csrf-token]').attr('content')); }, dataType: "json", contentType: "application/json; charset=utf-8", processData: false, data: JSON.stringify(dataObject), context: document.body, success: function(data,status){ successFunction(data,status);}, error: function(data,status){ errorFunction()} }); } 

素晴らしい作品これに関する複数のチュートリアル - それでも同じ問題 – gorootde

答えて

8

検索の6日後、私は最終的にそれを作った:レールが見つからないためX-CSRF-Tokenヘッダのセッションを破壊するよう

は思えます。私はjQueryののajaxSendフックで、今ではこのヘッダーを追加してい:

$(document).ajaxSend(function(e, xhr, options) { 
    var sid = $("meta[name='csrf-token']").attr("content"); 
    xhr.setRequestHeader("X-CSRF-Token", sid); 
}); 

今期待通りに働いています。

1

私はbeforeSend方法であること入れる:試しました

関連する問題