【问题标题】:Rails 3: Simple AJAXy Page updates?Rails 3:简单的 AJAXy 页面更新?
【发布时间】:2011-04-30 07:11:01
【问题描述】:

我不敢相信我已经为这个简单的任务寻找了四个小时,但我确实做到了。

在 Rails 2.3 中,我可以用以下简单代码替换页面的一部分:

渲染 :update do |page| page.replace_html "div_id", :partial => "new_content",... 结束

在 Rails 3 中,Ryan Bates 让我编写全新的 javascript 函数,从 Prototype(rails 默认)切换到 jQuery,否则无法享受生活。其他的教程也没有那么简单了。

我错过了什么?这些天我们如何替换<div>

【问题讨论】:

    标签: ruby-on-rails jquery rjs


    【解决方案1】:

    你还有 jQuery 吗?我会在任何一天都推荐它而不是 Prototype...

    如果它仍然存在,您可以在 Javascript 中使用以下内容:

    $.get("<%= url_for path/to/partial %>",
          function(response) {
            $("#div_id").html(response);
          });
    

    这会通过 AJAX 获取部分内容,然后将其转储到 id 为 div_id 的 div 中。

    希望这会有所帮助!

    【讨论】:

    • 不,现在只是想更新到 Rails 3,今天不想学习 jQuery。 :-) page.replace_html 看起来简单有效。
    • 该死,啊!不幸的是,我太久没有使用 RJS 或 Prototype,以至于我忘记了如何使用它们!
    【解决方案2】:

    我什至不确定您是否需要进行 AJAX 调用来加载该部分。我相信在 js.erb 文件中,对 render(:partial => object_or_path) 的调用只会返回一个包含所有 html 的字符串,您可以将其包装在 jQuery 对象中并附加。示例:

    $('#div_id').html($('<%= render :partial => @object %>'))
    

    【讨论】:

      【解决方案3】:

      整个 RJS 东西使 javascript 内联并使 dom 非常突兀。此外,通过避免使用内联 javascript,您可以通过在浏览器中压缩缓存这些文件来打开其他可能的优化 javascript 的方法。这就是 RJS 超出 rails 3 范围的原因。花一点时间使用 jQuery 或 Prototype 应该会让您熟悉这些小东西,并且从长远来看将有助于项目。

      【讨论】:

        【解决方案4】:

        谢谢,伙计们。官方的回答似乎是,是的,团队认为简单是善的敌人,因此变得更加复杂。

        第一个关键是为 CALLING ajax 更新的方法创建一个 .js.erb 文件。因此,如果 index 方法处理更新,请将原始 javascript 放入 index.js.erb。这在视图文件夹中。

        其次,在 index.js.erb 中工作的代码是

        m = $('list_users');    
        m.innerHTML = "<%= escape_javascript(render :partial => "reload_users") %>";
        

        然后进行调用,在控制器方法的respond_to块中添加:

        format.js
        

        最后,调用视图有:

        <%= link_to "Update User List", @reload_users_path, :remote => true %>
        

        顺便说一句,如果您安装插件,据说所有使用page.replace 的旧页面都可以使用。插件下载页面表明它在 Rails 3 的最新版本中出现故障,并且尚未修复。还有,各种博主都会到你家,用birch-switch你。

        【讨论】:

        • 我不确定为什么一些 Rails 开发人员认为 .replace_html 是“内联 javascript”。它是 RPC(远程过程调用)一种可靠的设计模式。他们只需要将后端转换为 RPC 客户端/服务器消息传递服务,并使客户端 API 库不可知。
        【解决方案5】:

        试试这个:

        page.call "$('#div_id').html", render(:partial => 'new_content')
        

        【讨论】:

          【解决方案6】:

          据我所知,与上述答案相同,您可以在模板中执行以下操作:

          <%= link_to "Update User List", @reload_users_path, :remote => true %>
          

          在控制器中,这样做:

          respond_to do |format|
            format.js {
              render :text => "alert('reloaded')"
            }
          end
          

          通过这种方式,您可以让控制器“执行”客户端 JS,这与以前的 render :update 非常相似。这相当于在 Rails 2 中执行以下操作:

          render :update do |page|
             page << "alert('reloaded')"
          end
          

          有什么理由不推荐这种方法吗?

          【讨论】:

            猜你喜欢
            • 2011-09-26
            • 1970-01-01
            • 1970-01-01
            • 2010-10-29
            • 1970-01-01
            • 2011-07-03
            • 1970-01-01
            • 2021-11-03
            相关资源
            最近更新 更多