我有一个使用omniauth 的rails 应用程序。并将令牌保存在我的数据库中。身份验证过程完成后,我想使用 jQuery 从omniauth 提供程序中提取数据,如何在我的 jQuery 脚本中使用例如@current_user.token?
3 回答
由于 jquery 仅在浏览器上下文中运行,它不能直接查询服务器上的数据库。
如果您想从客户端上的数据库中获取某些值。我建议要么对某个服务器端点进行 AJAX 调用,要么将值(可能为 JSON)写入页面并使用 jquery 选择器获取它,例如:$('server_value')......
对于 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 对象返回。
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');