2012-12-11 59 views
7

我正在編寫一個Rails應用程序。Coffeescript訪問current_user

在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沒有定義

謝謝!

回答

1

我會建議使用gem'gon',這對於在rails應用程序中將數據從ruby傳遞給咖啡很有用。這裏是關於坤的用法的the Railscast,這是repository of 'Gon'

+0

剛會工作。但是,在觀看railscast時,我發現我可以使用<%= content_tag「div」,id:「calendar」,data:{employeeid:current_user.employee.id} do%> – Reddirt

+0

我相信'data'僅適用於HTML5。 –

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等等)。

+0

這是行不通的,因爲在您訪問coffescript文件中的'employee_id'之前,資源是預編譯的**,所以您得到'未定義的本地變量或方法employee_id'' ... – prograils

6

如果你正在寫coffescript 內軌資產管道(我認爲你這樣做),你不能訪問CURRENT_USER可言。這裏的問題是,當您部署到prod env時(或在dev env中進行第一次訪問時),資產會預編譯一次。所有後續請求都只能鏈接到預編譯的js包。所以js代碼對於所有請求都是一樣的。另一方面,current_user是特定於每個請求的。所以,爲了從assets pipeline js代碼中訪問current_user,你必須通過一些ajax調用從特定的服務器api方法請求它。

其他可能的選擇是您正在編寫一個coffeescript作爲控制器操作視圖模板。在這種情況下,您應該添加.erb預處理器。你會得到像應用程序/視圖/ CONTROLLER_NAME/action_name.js.coffee.erb一個文件

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

希望這將有助於

+0

這很有趣 - 我沒有知道你可以添加erb到coffeescript。 – Reddirt

+1

您可以添加.erb到*任何*。這樣做時,請從右向左閱讀擴展表單:my_file.js.coffee.erb是一個erb文件,它將生成一個咖啡文件,該文件將生成一個將被提供給客戶端的js文件。 – almathie

0

我建議3個選項。但所有這些都不安全:

  1. 一些從咖啡到服務器的AJAX調用(我還沒有嘗試過)。
  2. user_id渲染爲HTML視圖中標記的屬性,然後通過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') 
  • 在登錄過程中純的Cookie設置user_id和從內部咖啡讀取該cookie文件爲JS調用document.cookie。如果您使用的設計,實現一個看守鉤喜歡這裏: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");