js:未定义的局部变量或方法`current_user'

时间:2014-06-30 22:49:30

标签: javascript ruby-on-rails angularjs ruby-on-rails-4

我的js文件带有嵌入式ruby代码:

function MyController($scope) {
  $scope.sayHello = function() {
    var hello = <%= current_user.name %>;
    $scope.greeting = hello;
  };
}

但是我发现错误undefined local variable or method current_user指向

= javascript_include_tag "application", "data-turbolinks-track" => true

我该如何解决?谢谢!

2 个答案:

答案 0 :(得分:3)

使用gon gem https://github.com/gazay/gon最简单的方法将数据从您的rails环境传递到您的javascript环境(换句话说:从您的服务器到您的客户端)。

控制器中的

# Make sure first that current_user is not nil
gon.current_user_name = current_user.name
# As you can see we don't pass the whole `current_user` but only the data we need
#   gon and javascript won't know how to use your Rails objects
#   so pass only strings, integers, arrays and hashs
#   (but you'll figure out all of this by your self, it's pretty natural)
您的布局中的

(有关gon安装的更多信息可以在gon github页面中找到)

<head>
  <%= include_gon %>
  ...

在你的javascript中

var hello = gon.current_user_name;

答案 1 :(得分:2)

<强> JS

要扩展Benjamin Sinclaire的答案,您必须记住Rails是back-end系统; JS是front-end

这意味着所有Rails变量仅在后端的Rails文件中可用 - 您的浏览器收到的是一组预先渲染的HTML文件,其中填充了您的数据

您遇到的问题是,如果没有将数据翻译从Rails转换为&#34; JS&#34;,JS就无法读取Rails数据。所有JS看到的都是DOM - 页面上的HTML元素

-

数据

为了在JS / current_user中共享诸如front-end之类的变量,您基本上需要将其传递给HTML层

您可以通过设置隐藏元素(并设置其data attributes)或在layout

中设置变量来执行此操作

如上所述,最有效的方法是使用Benjamin Sinclaire已经讨论过的gon gem