繁体   English   中英

Coffeescript访问current_user

[英]Coffeescript access to current_user

我正在写一个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未定义

在此先感谢您的帮助!

如果您在rails资产管道中编写coffescript(我相信您这样做), 则根本无法访问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 %>

希望这会有所帮助

我猜测这个上下文中的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,等等)。

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

我建议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 ,并从咖啡文件中读取该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

CoffeeScipt:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM