从Rails 3中的application.js访问current_user变量

时间:2015-04-20 00:09:04

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

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

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

但它失败了:

enter image description here

如何从位于/assets/my_script.js.erb的脚本中获取设备变量,例如来自devise gem的current_user,我认为它不应该是因为theese变量可能无法从公共站点加入,或者是什么应该怎么做?

谢谢!

3 个答案:

答案 0 :(得分:15)

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

的application.js

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

答案 1 :(得分:3)

  1. 查看rails casts中的this episode
  2. 尝试使用gon gem

答案 2 :(得分:1)

将当前用户从应用程序控制器传递为JSON,以便javascript可用。

应用程序控制器

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