Ruby on rails 如何升级:更新=>';部门id';从Rails 2到Rails 3的远程表单选项?

Ruby on rails 如何升级:更新=>';部门id';从Rails 2到Rails 3的远程表单选项?,ruby-on-rails,ajax,ruby-on-rails-3,upgrade,form-for,Ruby On Rails,Ajax,Ruby On Rails 3,Upgrade,Form For,我不知道如何将这段代码从Rails 2升级到Rails 3: <% remote_form_for(item, :update => 'div_id') do |f| %> ... “div_id”)do | f |%> ... 我试过这个: <%= form_for :item, :remote => true, :url => { :controller => "items", :action => "create" }, :updat

我不知道如何将这段代码从Rails 2升级到Rails 3:

<% remote_form_for(item, :update => 'div_id') do |f| %>
... 
“div_id”)do | f |%>
... 
我试过这个:

<%= form_for :item, :remote => true, :url => { :controller => "items", :action => "create" }, :update => 'div_id' do |f| %>
...
true,:url=>{:controller=>“items”,:action=>“create”},:update=>“div_id”do | f |%>
...

它创建了新项目,但在更新
标记中的内容时失败。Rails 3似乎不再支持用于的远程
表单的“
:update
”选项。有什么建议吗?

最简单的方法是编写一个javascript视图模板,例如,
create.js.erb
,看起来像这样:

$('#div_id').html("<%= escape_javascript(render(@item)) %>");
$('#div_id').html(“”);
(当然,根据您的设置,我假设一个
@item
变量和一个关联的
\u item
部分)

编辑:
科雷沃德是对的。这是RJS方式,更像是老式的Rails2.x“RailsWay”。它可能更熟悉,但也有问题。实际上,您的具体情况就是其中之一,因为通常您可能会绑定到HTML元素以使用记录的
id
(例如div#item_1)进行更新,而在
create
情况下,事先没有可用的
id
,这会使事情变得复杂


通过clientside JS绑定消除了这个问题。RJS在某种程度上是在真空中工作的,对客户端HTML的状态进行假设,并且无法访问它。

您可以使用RJS,但也有人不赞成使用RJS(这是有充分理由的)。在Rails 3+中处理此问题的简化最佳实践方法如下(假设使用jQuery):

#your_view.html.erb
true,:id=>form id'do | f |%>
...
#application.js(或页面上加载的任何其他.js)
$(函数(){
$('#form id').bind('ajax:success',函数(xhr,数据,状态){
$('#receiver id').html(数据);
});
});

jquery-ujs(又称jquery-rails,又称rails-ujs)远程链接/表单处理程序调用
ajax:success
hook。还有很多其他回调/挂钩可供您使用。如果您想让这变得更加灵活,您可以使用
live
而不是
bind
,并绑定到一个指定输出位置的类(例如“侧栏”),然后所有带有
侧栏的远程链接/表单都会将其HTML响应转到
div#sidebar

我知道这个问题由来已久,但我在迁移到Rails 3时发现了一种很好的方法,所以我想我会在这里发布它,以防其他人也有类似的解决方案

在layouts/update_page.js.erb中,我放置了以下文件:

$j('#<%=@update_div_id||"list_div"%>').html('<%= escape_javascript render(:partial => (@partial_div||"index"), :locals => @local_hash) %>');
因为正在使用remote,所以它总是首先尝试使用javascript,因此它将从上面呈现update_page.js.erb文件。对于我们来说,我们几乎总是在索引页面上使用div#list(div#list)div,因此我们默认情况下会更新它,但是如果需要更新其他内容,可以传入@update(u div)id,如果需要呈现不同的页面,可以传入@partial(u div)


澄清一下,对于很多事情来说,使用回调可能是更好的做法,但我发现这是一种更简单的方法,因为我们必须迁移近100个这样的调用。

感谢您的建议,但可能我对这方面太新手了(我几个月前开始研究RoR),所以我无法让您的解决方案起作用。我想我需要使用“live”而不是“bind”,因为我需要在表单提交时更新div(示例中为id=“div\u id”)的内容(不一定要成功创建新项)。假设这是我第一次使用jQuery,有人可以写下一个解决方案吗?无论如何谢谢你。听起来你需要一个教程。去做一个jQuery教程,一个针对Rails的不引人注目的javascript教程,以及另一个针对远程/ajax Rails请求的教程。好吧,我一定会听从你的建议,因为jQuery绝对在我的学习清单中。我只希望在短时间内解决这个问题,@Duccio可能遇到的一个问题是Javascript驱动程序不兼容。coreyward的解决方案假设Rails javascript驱动程序是jQuery。默认情况下,Rails 3.0安装原型javascript驱动程序。当您尝试使用jQuery.FYI定义钩子时,这是有问题的-本例中的Javascript缺少一个最终版本);
$j('#<%=@update_div_id||"list_div"%>').html('<%= escape_javascript render(:partial => (@partial_div||"index"), :locals => @local_hash) %>');
respond_to do |format|
  format.html
  format.js {render 'layouts/update_page'}
end