2011-04-26 46 views
0

我是web開發新手,所以我希望這是有道理的。我正在使用Ruby 1.8.7和Sinatra。我在config.ru設置一個變量,像javascript改變ruby變量

$MyFile = "file.json" 

然後我叫ERB文件,它使用可變打開"file.json",得到一些數據並顯示它。到現在爲止還挺好。

如果用戶在頁面上激活了一個下拉菜單,我的javascript代碼會偵聽,並且應該重新加載頁面,但是與$MyFile = "file2.json"一樣,因此顯示的數據將會不同。我可以檢測到更改並重新加載頁面,但是我不知道如何更改該變量。

是否可以從本質上調用$MyFile = "file2.json"從JavaScript?當然,調用Ruby函數也可以。

再一次,我不是真正有經驗的這種東西。我讀過AJAX可能是需要的,但我對AJAX一無所知。

回答

2

所以你不能只使用javascript來更改服務器端變量而不需要任何額外的請求。如果你想在不刷新頁面的情況下改變一個變量,你必須使用Ajax發送一個請求到一個帶有參數的url,以獲得新值。你已經知道如何在sinatra中創建一個路徑,以及如何明顯改變變量,所以你只需要研究一個像jQuery和它的ajax庫這樣的javascript框架來幫助你進行調用。

順便說一下,Ajax基本上只是讓瀏覽器與服務器通話,發出請求並獲取數據而無需刷新頁面的一種方式。一個簡單的ajax請求只是指向一個url,就像當你通過瀏覽器(GET)或者提交一個表單(POST)來訪問url一樣,並且返回該url的響應,這樣你就可以使用javascript來改變頁面。

所有的說法,你應該重新考慮你的應用程序的方式。例如像$ MyFile這樣的全局變量只存在一次,所以一個用戶改變它會改變你的網站上的所有用戶。

實際上,想一下在服務器和客戶端之間絕對需要發生什麼類型的交互,需要存儲哪些狀態以及可以存儲哪些狀態,並查看盡可能多的例子,您可以找到並嘗試複製他們並改變下襬到你想做的事情。

祝你好運!

0

我真的不明白這個問題。但config.ru是你的應用程序的機架配置。這不是業務邏輯的好地方。

0

我無法清楚地理解您的問題。但是,我發佈了示例代碼,因爲我假設您的問題的要求。

我承擔的JavaScript代碼監聽功能「when_change_drop_down()」

<div id="content"> THIS IS YOUR FILE.JSON CONTENT LOCATION </div> 
<% $MyFile = "file.json" %> 
<%= text_field_tag "myfile", "#{$MyFile}" %> 

<script language="javascript"> 
function when_change_drop_down() { 
    var pars = "filename=" + document.getElementByID('myfile'); 
    new Ajax.Updater("","/controller/action?"+pars, { 
      asynchronous:true, 
      evalScripts:true, 
      onComplete:function(request){    
       document.getElementById('content').innerHTML = request.responseText; 
      }, 
      onLoading:function(request){ 
       // Your loading porcesss 
      } 

     }); 
}  
</script> 

所以,你可以很容易地改變文本框的值也,當下拉改變。
我希望這對你有所幫助。