2014-10-02 86 views
0

有兩種方法我知道通過在控制器(/行動)定義爲JS變量...Rails:使用ERB將控制器變量傳遞給JS使頁面變慢?

官方的方式是

.js.erb

var banana = "<% @banana %>" 

另一個方式(即我目前使用的是)

.html.erb

<span id="banana-variable" style="display:none"><% @banana %></span> 

的.js

var banana = $("#banana-variable").html() 

此JS文件被裝載在控制器的多個動作/視圖。對我來說,不要使用.erb擴展名是有意義的:用戶第一次在控制器中執行任何動作/視圖時緩存它。當他們瀏覽到不​​同的頁面時,他們不必下載不同版本的文件。我對嗎?

+0

什麼是你的問題? – Surya 2014-10-02 09:59:35

+0

'var banana =「<% @banana %>」'通過什麼都沒有。 '<% @banana %>'也沒有通過。 – 2014-10-02 10:06:37

回答

5

是的,是對的。 JavaScript將被緩存在客戶端的瀏覽器上。

您還想發送'js'或腳本文件的數據,您可以使用這個名爲Gon的寶石。

1

我覺得你的問題是,你正在使用<% %>將執行代碼,而不是<%= %>將執行代碼和呈現結果返回到模板。

+0

當客戶端遇到不同的動作時,javascript文件會被客戶端下載,那麼他們將如何加載其中的任何一個? – 2014-10-02 15:10:46

0

Gon只有在加載html頁面後才能訪問頁面。根據我的理解,它使用網頁作爲代理將數據從Rails服務器傳輸到JavaScript。
但是,如果你想要在任何時間點使用變量,你可以從javascript到rails控制器做一個ajax(post)請求,並以json的形式獲取這個值。

例子:

AJAX請求:

$.ajax({ 
     type: "POST", 
     url: <PageURL>, 
     async: false, 
     dataType: 'application/json', 
     success: function(data){ 
      data = JSON.parse(data); 
     }, 
     }); 

你的 「數據」 將包含返回值。

在控制器方面,它應該是:

控制器:

def <PageURL> 
    render :json => {:result => <value_you_want_to_return>} 
end 


不要忘記的routes.rb文件來定義控制器的路徑。