これは非常に単純な質問かもしれませんが、私はその答えを見つけることができませんでした。javascript/jQuery から (バックボーン ビューから) Rails セッション変数にアクセスするにはどうすればよいですか? ほとんどの場合、これはベスト プラクティスではありませんが、私にとっては問題ではありません。
ありがとう、アレクサンドラ
これは非常に単純な質問かもしれませんが、私はその答えを見つけることができませんでした。javascript/jQuery から (バックボーン ビューから) Rails セッション変数にアクセスするにはどうすればよいですか? ほとんどの場合、これはベスト プラクティスではありませんが、私にとっては問題ではありません。
ありがとう、アレクサンドラ
gon gemを使用できます。リクエストごとにデータを自動的に送信し、javascript からアクセスできるようにします。
たとえば、Gemfile に gem を含めた後、ApplicationController に before フィルターを追加できます。
class ApplicationController < ActionController::Base
before_filter :set_gon
...
protected
def set_gon
gon.my_session_variable = session[:my_session_variable]
end
end
アプリケーションのレイアウトで、html のセクション ヘッド:
<%= include_gon %>
これで、JavaScript からこの値を読み取ることができます。
alert(gon.my_session_variable)
このようにして、リクエストに固有のデータのみを ajax レスポンスに含め、追加情報はすべて gon 変数から入手できます。
いいえ、セッション変数はサーバー上に存在するため、javascript/jquery を使用してセッション変数に直接アクセスする方法はありません。
あなたの最善の策は、javascript/jQuery を使用してサーバーに ajax 呼び出しを行い、定義した URL に対して、たとえば JSON 形式で必要なセッション変数を返すことです。これにより、Javascript で直接アクセスできます。
{
"sessionVariableName": "sessionVariableValue"
}
いいえ、これは間違いなくベスト プラクティスではありません。セッション変数はサーバー IMO にとどまる必要があります。
これが誰かを助けるかもしれない場合に備えて...
ejosafat の答えは有効ですが、Backbone から Rails セッション変数にアクセスする必要があった主な理由は、それらを変更できるようにするためでした。自分が何を望んでいるのかよくわからなかったので、私の質問はそもそもあいまいでした (たとえば、セッション変数へのアクセスは直接的なプロセスである必要はありませんでした)。私が最終的に目標を達成する方法は、次の 4 ステップのプロセスを使用することでした。
sessions_controller.rb ファイルで必要な Rails セッション変数を必ず初期化してください
変更できるようにしたいセッション変数の値をバックボーンに送信します(私の場合、セッション変数は使用されたレールコントローラーによってアクセスされ、対応するレールビューに送信され、次にバックボーン app.js ファイルに送信されました、必要なバックボーン ビューにアクセスできるようにします)
バックボーンからのGETリクエストに基づいてRailsセッション変数を更新できるRails側(使用されているコントローラー内)に関数を作成します。例えば:
def modify_session_variables
if params[:taskParentId]
session[:task_parent_id] = params[:taskParentId]
end
end
セッション状態を表すバックボーン変数がユーザーによって変更されるたびに、Rails セッション変数の更新された値を含む ajax リクエストをサーバーに送信します。たとえば、私のバックボーン モデルの 1 つは、属性の 1 つが変更されたときにセッション変数を更新します。
saveAsParentTask: function() {
var self = this;
$.ajax({
url: '/modify_session_variables',
type: 'GET',
data: {
taskParentId: self.getId()
},
async: false,
success: function() {
App.filtersState.setSubtreeParent(self);
}
});
},
このプロセスは、ユーザーがアプリケーションからログアウトしない限り、ユーザーの選択を保存します。少し複雑ですが、希望どおりに動作します。