javascript更改ruby变量
我是网络开发新手,所以我希望这是有意义的。我正在使用Ruby 1.8.7和Sinatra。我在config.ru中设置了一个变量,如javascript更改ruby变量,javascript,ruby,variables,Javascript,Ruby,Variables,我是网络开发新手,所以我希望这是有意义的。我正在使用Ruby 1.8.7和Sinatra。我在config.ru中设置了一个变量,如 $MyFile = "file.json" 然后我调用一个erb文件,它使用该变量打开“file.json”,获取一些数据并显示它。到目前为止还不错 如果用户激活页面上的下拉列表,我的javascript代码将侦听并重新加载页面,但使用$MyFile=“file2.json”,因此显示的数据将不同。我可以检测到更改并重新加载页面,但是我不知道如何更改变量 是否可
$MyFile = "file.json"
然后我调用一个erb文件,它使用该变量打开“file.json”
,获取一些数据并显示它。到目前为止还不错
如果用户激活页面上的下拉列表,我的javascript代码将侦听并重新加载页面,但使用$MyFile=“file2.json”
,因此显示的数据将不同。我可以检测到更改并重新加载页面,但是我不知道如何更改变量
是否可以从javascript中调用$MyFile=“file2.json”
?当然,调用Ruby函数也可以
再说一次,我对这件事不是很有经验。我读到可能需要AJAX,但我对AJAX一无所知。我不太理解这个问题。但是config.ru是应用程序的机架配置。这不是业务逻辑的好地方。因此,在没有任何额外请求的情况下,不能仅使用javascript更改服务器端变量。如果希望在不刷新页面的情况下更改变量,则必须使用Ajax向某个url发送一个请求,其中包含新值的参数。您已经知道如何在sinatra中创建路由,以及如何更改变量,因此您只需要查看一个javascript框架,如jQuery及其ajax库,以帮助您进行调用 顺便说一句,Ajax基本上只是一种浏览器与服务器对话、发出请求和获取数据的方式,而无需刷新页面。简言之,ajax请求只指向url,就像使用浏览器(GET)访问url或提交表单(POST)一样,并返回该url的响应,以便使用javascript更改页面 尽管如此,您可能应该重新考虑您的应用程序。例如,像$MyFile这样的全局变量只存在一次,因此一个用户更改它将为您网站上的所有用户更改它 本质上,思考服务器和客户机之间绝对需要发生什么样的交互,必须存储什么状态以及可以将其存储在何处,并查看尽可能多的示例,尝试复制它们并将它们更改为您想要做的事情
祝你好运 我不能清楚地理解你的问题。但是,我发布了示例代码,因为我根据您的问题假设了需求 我假设javascript代码监听函数“when\u change\u drop\u down()”
这是您的FILE.JSON内容位置
更改下拉菜单时的函数(){
var pars=“filename=“+document.getElementByID('myfile');
新的Ajax.Updater(“,”/controller/action?”+pars{
是的,
evalscript:对,
onComplete:函数(请求){
document.getElementById('content').innerHTML=request.responseText;
},
加载:函数(请求){
//你的装货程序
}
});
}
因此,当下拉列表更改时,您也可以轻松更改文本框值。我希望这对你有帮助
<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>