【问题标题】:Rails - OK to set a Rails variable inside a javascript function?Rails - 可以在 javascript 函数中设置 Rails 变量吗?
【发布时间】:2011-03-16 09:46:55
【问题描述】:

在 javascript 函数中设置 Rails 变量有什么问题吗?我无法在谷歌上找到明确的答案,只是想确保没有我不知道的问题或缺陷。我实际上对它的工作原理感到困惑 - 如果在客户端执行 javascript,我不会假设 Rails 会在视图呈现后响应视图中的变量变化..?

(示例)我有多个函数调用同一个表单,我需要知道哪个函数调用表单来执行控制器方法中的特定任务(在这种情况下会话是 cookie,但我也尝试了本地 Rails变量,它也可以工作)。

<script type="text/javascript">

    $('.open_new_item_form' ).click(function(){
     alert('<%= session[:item_form_type]%>');
        <% session[:item_form_type] = "from_new_item_click" %>
     alert('<%= session[:item_form_type]%>');
        var url = $(this).attr("href");
        $.ajax({
etc...

警报似乎表明它运行良好。它将以当前值和设置后的新“from_new_item”值发出警报。

谢谢 - 只是确保

【问题讨论】:

  • 我们能否将 javascript 变量传递给该会话而不是设置字符串。

标签: ruby-on-rails


【解决方案1】:

您的erb 文件正在服务器上被完全解释;此行将执行 作为呈现 javascript 的一部分,而不是在客户端上执行 javascript 时执行:

    <% session[:item_form_type] = "from_new_item_click" %>

如果您将这行代码放在计算结果为 false 的 javascript if 块中,您的服务器端变量仍将被更改:

    if(0){<% session[:item_form_type] = "from_new_item_click" %>;}

(原谅我的pidgin-javascript,这不是我说的语言。)

【讨论】:

    【解决方案2】:

    rails 渲染过程的一部分是评估该视图中的所有 erb 代码。完成代码评估后,rails 将渲染文件(无论是 javascript、html 等)。

    因此,当您说您惊讶地发现 rails 可以响应变量更改时,那是因为此时视图实际上并未渲染......它正在渲染过程中。

    【讨论】:

    • 你先回答,所以检查你得到。我在自嘲。我想通了为什么它现在有效。它与页面设计有关,在对话框中出现 CRUD 表单之前选择项目“类型”......我会接受的!
    【解决方案3】:

    正如其他人所说,您的视图首先在服务器上呈现,然后发送到浏览器。当它到达浏览器时,你所有的 Ruby 代码早就被执行了,你在浏览器上看到的 Javascript 就是它的结果。尝试从浏览器中显示页面的来源;你应该看到这一行:

    alert('<%= session[:item_form_type]%>');
    

    已经被替换为:

    alert('from_new_item_click');
    

    如果您确实想在用户执行操作时更改服务器端 RoR 代码,则需要使用 AJAX。基本上,AJAX 让您的 Javascript 代码向 URL 发送 GET/POST。因此,在您的 .click 事件处理程序中,您可以点击一个 URL,该 URL 调用一个更改您想要的任何会话变量的操作。

    (抱歉,如果您已经了解 AJAX 的全部内容;但考虑到您的问题,我怀疑您可能不知道。)

    【讨论】:

    • 我筋疲力尽,完全糊涂了,谢谢你的想法。在这种情况下,我实际上很好。我不知何故筋疲力尽,愚蠢地偶然发现了在我的特定情况下有效的东西。
    猜你喜欢
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多