我正在编写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未定义
提前感谢您的帮助!
答案 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个选项。但所有这些都不安全:
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')
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");