Rails 3:简单的AJAX页面更新?

13

我简直不敢相信我已经为这个简单的任务寻找了四个小时,但事实就是这样。

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

render :update do |page| page.replace_html "div_id", :partial => "new_content",... end

在Rails 3中,Ryan Bates让我编写完整的新JavaScript函数,从默认的Prototype切换到jQuery,生活变得不那么愉快。其他教程也不更加直观。

我错过了什么?如何替换<div>元素呢?

6个回答

12

谢谢大家。官方答案似乎是,是的,团队认为简单是好的敌人,所以让它变得更加复杂。

第一步是创建一个命名为调用ajax更新方法的.js.erb文件。因此,如果index方法处理更新,请将原始javascript放在index.js.erb中。这放在views文件夹中。

其次,在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的最新版本中失效了,并且没有被修复。此外,如果你使用这个方法,各种博客作者会来到你家并抽打你。


我不确定为什么一些Rails开发人员认为.replace_html是“内联JavaScript”。它是RPC(远程过程调用)的一个可靠的设计模式。他们只需要将后端转换为RPC客户端/服务器消息传递服务,并使客户端API库具有不可知论性。 - Greg

4
整个RJS的东西使得JavaScript内联,并且使DOM非常突出。此外,通过避免内联JavaScript,您可以通过在浏览器中“压缩”和“缓存”这些文件来打开其他可能的优化JavaScript的方法。这就是为什么RJS从Rails 3中逐渐淡出的原因。花一天时间用jQuery或Prototype解决这些小问题,将有助于项目的长期发展。

1

你们还在用jQuery吗?我推荐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 看起来足够简单和有效。 - Ed Jones
糟糕,唉!不幸的是我已经很久没有使用RJS或Prototype了,以至于我忘记如何使用它们了! - robbrit

0
据我所知,与上面的答案相同,您可以在模板中执行以下操作:
<%= 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

这种方法不可取的原因是什么?


0

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

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

-2

试试这个:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接