Coffeescript访问current_user

时间:2012-12-11 18:52:03

标签: ruby-on-rails coffeescript

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

但是,控制台显示 - 未捕获的ReferenceError:current_user未定义

提前感谢您的帮助!

4 个答案:

答案 0 :(得分:7)

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

另一种可能的选择是你正在编写一个coffeescript作为控制器动作视图模板。在这种情况下,您应该添加.erb预处理器。您将获得 app / views / controller_name / action_name.js.coffee.erb 等文件

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

希望这会有所帮助

答案 1 :(得分: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,等等)。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

我建议3个选项。但所有这些都不安全:

  1. 从咖啡到服务器的一些AJAX呼叫(我还没试过)。
  2. 在HTML视图中将user_id渲染为标记的属性,然后通过咖啡文件中的jQuery获取它。请参阅https://www.sitepoint.com/create-a-chat-app-with-rails-5-actioncable-and-devise/
  3. 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并从咖啡文件中读取该cookie作为JS调用document.cookie。如果您使用Devise,请执行类似此处的Warden挂钩:https://rubytutorial.io/actioncable-devise-authentication/
    2. 应用程序/配置/初始化/ 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");