0

我有一个使用omniauth 的rails 应用程序。并将令牌保存在我的数据库中。身份验证过程完成后,我想使用 jQuery 从omniauth 提供程序中提取数据,如何在我的 jQuery 脚本中使用例如@current_user.token?

4

3 回答 3

1

由于 jquery 仅在浏览器上下文中运行,它不能直接查询服务器上的数据库。

如果您想从客户端上的数据库中获取某些值。我建议要么对某个服务器端点进行 AJAX 调用,要么将值(可能为 JSON)写入页面并使用 jquery 选择器获取它,例如:$('server_value')......

于 2011-03-17T04:46:10.893 回答
1

对于 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) %>");

您可以通过将 .js 附加到您的 URL 来直接调用您的操作。

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 对象返回。

于 2011-03-17T08:32:16.523 回答
0

eggie5 通过 AJAX 获取 JSON 的想法很好……另一种选择是将令牌放入 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');
于 2011-03-17T22:17:36.477 回答