【问题标题】:Accessing current_user variable from application.js in Rails 3从 Rails 3 中的 application.js 访问 current_user 变量
【发布时间】:2015-04-20 00:09:04
【问题描述】:

我希望从我的 application.js 访问我的 current_user 变量(我将我的 application.js 重命名为 application.js.erb 以便服务器可以理解我的 ruby​​ 代码),所以我得到了类似的东西:

function hello(){ alert("<%= current_user.name %>"); }

但它失败了:

我如何从位于 /assets/my_script.js.erb 中的脚本工作的 devise gem 中获取像 current_user 这样的会话变量,我认为它不应该被启用,因为这些变量可能无法从公共站点访问,或者什么应该怎么办?

谢谢!

【问题讨论】:

  • 在 js 文件中使用 ruby​​ 的最简单方法是在 js 文件中使用 js.erb 扩展名。
  • @RAJ 同意了,但此时的问题是访问 current_user 变量

标签: javascript ruby-on-rails ruby ruby-on-rails-3 devise


【解决方案1】:

Application.js 不会在任何会话变量或方法的上下文中进行评估。从 javascript 访问用户名的最简单方法是在应用程序控制器的 before_action 中设置 cookie:

class ApplicationController < ActionController::Base
  before_action :set_user

  private

  def set_user
    cookies[:username] = current_user.name || 'guest'
  end
end

然后你可以从 app/assets 中的任何 js 访问 cookie:

alert(document.cookie);

一个更详细但可以说更简洁的方法是创建一个访问当前用户并返回用户名的路由,例如

routes.rb

get 'current_user' => "users#current_user"

users_controller.rb

def current_user
    render json: {name: current_user.name}
end

应用程序.js

$.get('/current_user', function(result){
  alert(result.name);
});

【讨论】:

  • 大卫,你能看看这个问题吗:stackoverflow.com/questions/34323316/…?这是一个类似的问题,但我不确定处理这个问题的最佳方法是什么。我想你可以马上告诉我完美的解决方案。谢谢!
  • 这在开发中效果很好,但是一旦我投入生产,它甚至无法识别脚本。对此有什么想法吗?
  • @gwalshington 是您在 application.js 中的脚本还是自定义脚本?如果你把它放在其他地方,你需要检查你是否正确地预编译了你的资产——关于这个主题有很多关于 SO 的问题
  • @DavidJohnSmith 它在 app.js 中
  • @DavidJohnSmith 感谢您的回复,我真的很喜欢您的方法,我没有在 js 中渲染 ruby​​ 变量,但我可以通过 js 或 session 变量通过 cookie 获取它们,太棒了!
【解决方案2】:
  1. 看看 this episode 在 rails casts
  2. 尝试使用gon gem

【讨论】:

  • 我明白了,我可以让我的 js.erb 理解 ruby​​ 代码,例如 alert(" ");工作,但我不能让它与 current_user 变量一起工作
【解决方案3】:

从应用程序控制器传递当前用户以 JSON 格式查看,以便其可用于 javascript。

应用程序控制器

def method_name
  respond_to do |format|
     format.json{ render :json => @user.to_json }
  end
end

【讨论】:

  • 这会产生将用户的所有信息暴露给用户的副作用,您可能不想这样做。
猜你喜欢
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
  • 1970-01-01
  • 2014-11-07
相关资源
最近更新 更多