如何将remote_form_for的:update =>'div_id'选项从Rails 2升级到Rails 3?

时间:2011-08-12 17:30:44

标签: ruby-on-rails ajax ruby-on-rails-3 upgrade form-for

我无法弄清楚如何将此代码从Rails 2升级到Rails 3:

<% remote_form_for(item, :update => 'div_id') do |f| %>
... 

我试过了:

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

它会创建新项目,但无法更新<div id="div_id"></div>代码中的内容。似乎Rails 3不再支持远程:update的“form_for”选项。有什么建议吗?

3 个答案:

答案 0 :(得分:9)

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

# your_view.html.erb
<div id="receiver-id"></div>

<%= form_for :some_model, :remote => true, :id => 'form-id' do |f| %>
  ...
<% end %>


# application.js (or any other .js loaded on the page)
$(function(){
  $('#form-id').bind('ajax:success', function(xhr, data, status){
    $('#receiver-id').html(data);
  });
});

ajax:success挂钩由jquery-ujs(又名jquery-rails,又名rails-ujs)远程链接/表单处理程序调用。 See for yourself.还有很多其他回调/挂钩供您使用。如果你想让它变得更加灵活,可以使用live而不是bind,并绑定到一个指示输出去向的类(例如“sidebar”),然后绑定所有远程链接/表单使用sidebar类,其HTML响应将转到div#sidebar

答案 1 :(得分:1)

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

$('#div_id').html("<%= escape_javascript(render(@item)) %>");

(取决于您的设置,当然,我假设@item变量和相关的_item部分

编辑:
coreyward是对的。这是RJS方式,它更像是老式的Rails 2.x“Rails方式”。它可能更熟悉,但有问题。实际上,您的具体案例就是其中之一,因为通常您可以绑定到HTML元素以使用记录id(例如div#item_1)进行更新,而create情况下则没有{{ 1}}事先可用,使问题复杂化。

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

答案 2 :(得分:0)

我知道这个问题已经过时了,但是当我迁移到Rails 3时,我发现了一个非常好的方法,所以我想我会在这里发布它以防其他人处于类似的解决方案。

在layouts / update_page.js.erb中我放了这个文件:

$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

由于正在使用远程,它将始终尝试首先使用javascript,因此它将从上面呈现update_page.js.erb文件。对我们来说,我们几乎总是在索引页面上使用div#list_div,所以我们默认更新它,但是如果你需要更新不同的东西,你可以传入@update_div_id,如果你需要渲染一个不同的页面,你可以传入@partial_div。

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