7

我正在编写一个 Rails 应用程序。

在 CoffeeScript 中,我想访问 current_user 以及它与员工的关系。

这是我正在尝试的代码:

    $.create "/events/",
      event:
        title: title,
        starts_at: "" + start,
        ends_at: "" + end,
        all_day: allDay,
        hours: hours,
        employee_id: current_user.employee_id
        # pickup the current employee

但是,控制台显示 - Uncaught ReferenceError: current_user is not defined

在此先感谢您的帮助!

4

4 回答 4

7

如果您在 Rails 资产管道中编写 coffescript (我相信您会这样做),则根本无法访问 current_user。这里的问题是,当您部署到 prod env(或在 dev env 中的第一次访问时)时,资产会预编译一次。所有后续请求都只是链接到预编译的 js 包。所以所有请求的js代码都是一样的。另一方面, current_user 特定于每个请求。因此,为了从资产管道 js 代码访问 current_user,您必须通过一些 ajax 调用从特定的服务器 api 方法请求它。

另一个可能的选择是您正在编写一个咖啡脚本作为控制器操作视图模板。在这种情况下,您应该添加 .erb 预处理器。你会得到一个像app/views/controller_name/action_name.js.coffee.erb这样的文件

$.create "/event",
  event:
    employee_id: <%= current_user.employee_id %>

希望这会有所帮助

于 2012-12-11T19:06:56.783 回答
3

我猜current_user在这个上下文中是一个你试图访问的 Ruby 值(一个控制器实例变量,或者,根据名称,可能是一个返回当前用户对象的 Devise 方法)。这在 JavaScript/CoffeeScript 中是不可见的。您可以在视图中设置它(例如 ERB),然后在其他 JavaScript 函数中访问它。

查看其他 Stack Overflow 问题,了解有关如何执行此操作的一些好的建议,包括指向 Railscast 剧集的链接。

简短的回答是,您可能会在 ERB 模板中需要这样的内容:

<script>
    employee_id = <%= current_user.employee_id %>
</script>

请注意,您不能只分配current_user给 JavaScript 变量,然后从 JS 调用该变量的方法;它只是不那样工作。您无法在 JS 中访问 Ruby/Rails 值;您必须存储 JS 可以理解的值(标量、JSON 等)。

于 2012-12-11T19:02:41.190 回答
1

我建议使用 gem 'gon',这对于在 rails 应用程序中将数据从 ruby​​ 传递到咖啡非常有用。这是关于 gon 用法的 Railscast ,这是'Gon' 的存储库

于 2012-12-11T18:59:57.010 回答
1

我建议3个选项。但它们都不安全:

  1. 从咖啡到服务器的一些 AJAX 调用(我还没有尝试过)。
  2. 在 HTML 视图中呈现user_id为标签的属性,然后通过 jQuery 在咖啡文件中获取它。请参阅https://www.sitepoint.com/create-a-chat-app-with-rails-5-actioncable-and-devise/

HTML:

<div id="user_id" data-user-id="<%= current_user.id %>">

咖啡脚本:

tag_user_id = $('#user_id')
current_user_id = tag_user_id.data('user-id')
  1. 在登录过程中设置user_id纯 cookie,并从咖啡文件中读取该 cookie 作为 JS 调用document.cookie。如果您使用 Devise,请在此处实现 Warden 挂钩:https ://rubytutorial.io/actioncable-devise-authentication/

应用程序/配置/初始化程序/warden_hooks.rb

Warden::Manager.after_set_user do |user,auth,opts|
  scope = opts[:scope]
  auth.cookies["#{scope}.id"] = user.id # not signed
end

咖啡师:

current_user_id = document.cookie.replace(/(?:(?:^|.*;\s*)user.id\s*\=\s*([^;]*).*$)|^.*$/, "$1");
于 2017-04-06T09:18:15.603 回答