Rails – 可以在javascript函数中设置Rails变量吗?
在javascript函数中设置Rails变量有什么问题吗? 我无法谷歌定义答案,只是想确保没有我不知道的问题或缺陷。 我真的很困惑这是如何工作的 – 如果在客户端执行javascript,我不会假设Rails会在视图呈现后响应视图中的变量..?
(示例)我有多个函数调用相同的表单,我需要知道哪个函数称为表单在控制器方法中执行特定任务(在这种情况下会话是一个cookie,但我也尝试了一个本地Rails变量,它同样有效)。
$('.open_new_item_form' ).click(function(){ alert(''); alert(''); var url = $(this).attr("href"); $.ajax({ etc...
警报似乎表明它运作良好。 它将使用当前的valute警告,然后在set之后发出新的“from_new_item”值。
谢谢 – 只是确定
rails的渲染过程的一部分是评估该视图中的所有erb代码。 完成代码评估后,rails将呈现文件(无论是javascript,html等)。
因此,当你说你很惊讶地看到rails可以响应变量时,这是因为视图实际上并未在那时呈现……它正处于渲染过程中。
您的erb
文件正在服务器上完全解释; 此行将作为呈现javascript的一部分执行,而不是在客户端上执行javascript时:
<% session[:item_form_type] = "from_new_item_click" %>
如果将此行代码放在javascript中, if
块的计算结果为false
,则服务器端变量仍将更改:
if(0){<% session[:item_form_type] = "from_new_item_click" %>;}
(原谅我的pidgin -javascript,它不是我说的语言。)
正如其他人所说,您的视图首先在服务器上呈现,然后发送到浏览器。 当它到达浏览器时,你的所有Ruby代码早已被执行,你在浏览器中看到的Javascript就是这样的结果。 尝试从浏览器中查看页面的来源; 你应该看到这一行:
alert('<%= session[:item_form_type]%>');
已经被替换,没有任何点击,有:
alert('from_new_item_click');
如果您确实想在用户执行操作时更改服务器端RoR代码,则需要使用AJAX。 基本上,AJAX允许您的Javascript代码向URL发送GET / POST。 因此,在.click事件处理程序中,您可以点击一个URL,该URL调用一个更改所需会话变量的操作。
(对不起,如果你已经了解了所有关于AJAX的内容;我怀疑你可能不会,但是,考虑到你的问题。)