【问题标题】:Coffeescript access to current_userCoffeescript 访问 current_user
【发布时间】:2012-11-29 09:07:17
【问题描述】:

我正在编写一个 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

提前感谢您的帮助!

【问题讨论】:

    标签: ruby-on-rails coffeescript


    【解决方案1】:

    如果您正在编写 coffescript inside rails assets pipeline(我相信您会这样做),那么您根本无法访问 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 %>
    

    希望这会有所帮助

    【讨论】:

    • 这很有趣——我不知道你可以将 erb 添加到咖啡脚本中。
    • 您可以将.erb 添加到任何东西。这样做时,从右到左阅读扩展表:my_file.js.coffee.erb 是一个 erb 文件,它将生成一个咖啡文件,该文件将生成一个将提供给客户端的 js 文件。
    【解决方案2】:

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

    查看this other Stack Overflow question 以获得有关如何执行此操作的一些好的指示,包括指向 Railscast 剧集的链接。

    简短的回答是,您可能需要在 ERB 模板中使用类似的内容:

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

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

    【讨论】:

    • 这不起作用,因为资产是预编译的之前你在你的coffescript文件中访问employee_id,所以你得到undefined local variable or method employee_id'...
    • @prograils 如果 script 标记出现在包含的咖啡脚本文件之前,它应该可以工作。话虽如此,我更喜欢将变量包含在 HTML 的 data- 属性中。
    【解决方案3】:

    我建议使用 gem 'gon' ,这对于在 rails 应用程序中将数据从 ruby​​ 传递到 coffee 很有用。这是the Railscast关于gon的用法,这是repository of 'Gon'

    【讨论】:

    • Gon 可以。但是,在观看 railscast 时,我发现我可以只使用
    【解决方案4】:

    我建议 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 %>">
    

    CoffeeScript:

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

    app/config/initializers/warden_hooks.rb

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

    CoffeeScipt:

    current_user_id = document.cookie.replace(/(?:(?:^|.*;\s*)user.id\s*\=\s*([^;]*).*$)|^.*$/, "$1");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多