2010-06-13 71 views
0

我有一個網站,我需要一個JavaScript版本的「當前用戶」對象以及ruby版本。我一直在分配這些變量做這樣的事情...我如何有條件地將ruby變量賦值給javascript變量?

Application Controller: 
def get_user 
    begin 
     @current_user = User.find(session[:user_id]) if session[:user_id] 
     @current_user_json = @current_user.to_json 
    rescue 
     session.delete(:user_id) 
     @current_user = nil 
     @current_user_json = {} 
    end 
    end 

Web Page: 
var current_user = null; 
current_user_json = '<%= @current_user_json %>'; 
if(current_user_json != ''){ 
     current_user = current_user_json.user; 
} 

即使有當前用戶,我得到的當前用戶是未定義的。可能是因爲我將current_user_json分配在單引號附近。但是,如果我不把它周圍的單引號,我總是在沒有用戶登錄一個JavaScript錯誤,因爲語法無效 -

current_user_json = ; 

我想我只是看着這個完全錯誤並且必須有更好的方法。鑑於這可能是一件常見的事情,我想獲得其他人關於如何在JavaScript中創建一個與Ruby對象相同的對象的意見。

回答

4

JSON是有效的Javascript。考慮取消引號,只是直接將其輸出:

current_user_json = <%= @current_user.nil? ? '' : @current_user_json %>; 

更重要的是,有你的控制器做所有的工作而不是把邏輯視圖:

@current_user_json = @current_user.nil? ? '{user: null}' : @current_user.to_json 
# ... 
current_user_json = <%= @current_user_json %>; 

(編輯:下面股份有限公司尖尖的建議。 )

+2

除「無」情況下,JSON不能只是空,或者作爲問題筆記會出現Javascript語法錯誤。它應該像'{user:null}'一樣。 – Pointy 2010-06-13 16:27:58

+0

尖尖的 - 你的增加使這個答案工作。謝謝 – Tony 2010-06-13 16:35:39

0

您沒有指定從哪裏得到您的to_json。如果您使用的是「json」寶石,nil.to_json會給出"null",這會在您的JS中產生current_user_json = null - 這是有效的。如果它不這樣做一些其他的庫,最簡單的很可能是覆蓋to_json所以它產生有效的響應:

class NilClass 
    def to_json 
    "null" 
    end 
end 
+0

這可能不是一個好主意。如果其他東西取決於'NilClass.to_json'的現有行爲呢? – 2010-06-13 17:30:33

+0

沒錯,別的東西可能會打破。但是,返回空值的空字符串可能不一致(我懷疑'[1,nil,3]'被序列化爲'[1,null,3]'而不是[1,3]'),並且因此是一個需要修復的bug。如果有什麼依賴於這樣的行爲,那幾乎肯定是一種黑客行爲,因此,一旦圖書館得到修復,就等待修復。我會提交一個錯誤報告,並在本地修復該庫,直到圖書館得到正確修復 - 或者使用更好的庫。 – Amadan 2010-06-13 17:56:55