2010-10-25 55 views
13

我不敢相信我一直在寻找这个简单的任务四个小时,但我有。Rails 3:简单的AJAXy页面更新?

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

渲染:更新办|首页| page.replace_html “div_id”:部分=> “NEW_CONTENT”,... 结束

在Rails 3,瑞恩·贝茨有我写整个新的JavaScript功能,从原型(轨道默认)到jQuery的切换,以及否则不享受生活。其他的通道不再简单。

我错过了什么?我们如何取代近期的<div>

回答

1

你还有jQuery吗?我想任何一天推荐它在原型...

如果它仍然存在,你可以只用在你的Javascript以下内容:

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

这得到通过AJAX的部分,只是转储入格id为div_id。

希望这会有所帮助!

+0

不,现在只是试图更新到Rails 3,不想今天学习jQuery。 :-) page.replace_html看起来简单而有效。 – 2010-10-25 16:03:40

+0

不错啊!不幸的是,我没有长时间使用RJS或Prototype,以至于我忘记了如何使用它们! – robbrit 2010-10-26 13:33:08

0

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

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

整个RJS东西使得内嵌的JavaScript,使DOM非常突兀。此外,通过避免内嵌JavaScript,你可以打开其他可能的方式来优化你的JavaScript由压缩缓存在浏览器中的这些文件。这就是为什么RJS超越了rails的范围3.一天中使用jQuery或Prototype解决一些问题应该让你了解这些小东西,并且将长期帮助这个项目。

12

谢谢,伙计们。官方的答案似乎是这样的,是的,团队感到简单是善良的敌人,并使其更加复杂。

第一个关键是创建一个.js.erb文件,命名为调用ajax更新的方法。因此,如果索引方法处理更新,请将原始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的最新发行版中打破并且尚未修复。另外,如果你使用它,各种博客将会来到你的家和桦树 - 切换你。

+0

我不确定为什么一些rails开发人员认为.replace_html是“内联javascript”。它是RPC(远程过程调用)一个坚实的设计模式。他们只需要将后端转换为RPC客户端/服务器消息传递服务,并使客户端API库不可知。 – Greg 2012-10-14 02:23:47

-2

试试这个:

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

答案不明白 – user1972007 2012-12-01 06:06:08

0

据我所知,在同一直线上如上答案,你可以做这样的事情在你的模板:

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

并在控制器,做到这一点:

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

这样你可以让控制器“执行”客户端JS很像render:upda te用来做。这相当于在Rails 2中执行以下操作:

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

是否有任何理由不推荐使用此方法?