omniauth を使用する Rails アプリケーションが 1 つあります。また、トークンをデータベースに保存します。認証プロセスが完了した後、jQuery を使用して omniauth プロバイダーからデータを取得したいのですが、jQuery スクリプトで @current_user.token などを使用するにはどうすればよいですか?
3 に答える
Rails 3では、js.erbテンプレートファイルを使用して、jQueryで変数を簡単に使用することをお勧めします。jsリクエストに応答するようにコントローラーを設定してから、そのURLにリクエストを送信すると、レンダリングされたjs.erbがブラウザーでjavascriptとして実行され、コントローラーアクションによって設定された変数を利用できます。
コントローラは次のようになります。
class Users < ApplicationController
respond_to :js, :only => :me
def me
@current_user = User.find(session[:user])
respond_with(@current_user)
end
end
次に、me.js.erbに次のように記述します
$('#current_user_token').html("<%= escape_javascript(@current_user.token) %>");
URLに.jsを追加することで、アクションを直接呼び出すことができます。
http://0.0.0.0:3000/users/me.js
テンプレートから:remote => trueオプションを追加して、リモートフォームまたはリンクを使用するだけです
link_to "Show user token", me_users_path, :remote => true
me.js.erbファイルは他のJSファイルと同じように機能し、必要な数のJSをそこに含めることができます。変数またはヘルパーを使用する場合は常にERBタグを使用しますが、escape_javascriptヘルパー "<%= escape_javascript(render @current_user)%>"でラップするようにしてください。
js.erbテンプレートをレンダリングせずに変数をリクエストするには、eggie5の提案を使用して、:jsonに応答するアクションに対してajaxリクエストを行います。@current_userをjsonオブジェクトとして返します。
jquery はブラウザー コンテキストでのみ実行されるため、サーバー上のデータベースに直接クエリを実行することはできません。
クライアント上のデータベースから何らかの値にアクセスしたい場合。サーバーエンドポイントへのAJAX呼び出しを行うか、値(JSONとして可能)をページに書き込み、jqueryセレクターを使用して取得することをお勧めします。$('server_value')......
AJAX経由でJSONを取得するというeggie5のアイデアは良いです...別のオプションは、トークンをCookieに入れて、JavaScript経由で常にアクセスできるようにすることです.
コントローラ
class SomeController
def some_action
cookies[:user_token] = current_user.token
end
end
js
function readCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for(var i=0;i < ca.length;i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1,c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
}
return null;
}
var token = readCookie('user_token');