2011-03-22 54 views
3

我正在将应用程序从Rails 2升级到3,并且正在重新编写所有远程函数以使用Unobtrusive Javascript。我在挣扎的地方是在UJS中处理ajax回调。带原型的Rails 3中的Ajax回调,而不是jQuery

我发现有很多资源显示如何使用jQuery实现这些回调,但对于原型并不多。也许你可以帮我弄清楚这一点。

在Rails 2,我有这样的:

<% remote_form_for @foo, {:loading => "loading_function()", :complete => "complete_function()" } do |f| %> 
... 
<% end %> 

在Rails 3,我有这样的:

<%= form_for @foo, :remote => true do |f| %> 
.... 
<% end %> 

从我到目前为止想通了(这可能是错误的),我需要将我的旧加载/完整函数附加到表单中,以便它们将被Rails.js中的handleRemote函数触发。我只是不知道该怎么去做。

同样,我在Prototype中这样做。所以对这个框架的具体答案表示赞赏。

回答

5

答案是:

<%= form_for @foo, :remote => true do |f| %> 
... 
<% end %> 
... 
<script type='text/javascript'> 
    $('edit_foo').observe('ajax:before', loading_function()); 
    $('edit_foo').observe('ajax:complete complete_function()); 
</script> 
0

试试这个link。是的,它是JQuery,但JQuery和Prototype没有区别事物如何协同工作。下面是直接在索引页增加了一个新的任务的代码片段 - 它使用原型:

views/tasks/_newform.html.erb: 
<%= form_for(@task, :remote => true) do |f| %> 
    <div> 
    <%= f.label 'Add a new task: ' %> 
    <%= f.text_field :name %> 
    </div> 
    <div> 
    <%= f.submit %> 
    </div> 
<% end %> 

views/tasks/index.html.erb: 
<div id='newform'> 
    <%= render :partial => "newform", :locals => { :@task => Task.new } %> 
</div> 

views/tasks/create.js.rjs: 
page.insert_html :after, 'tablehead', :partial => @task 
page.replace_html 'newform',:partial => "newform", :locals => { :@task => Task.new } 

编辑:你需要“format.js”添加到我们的任务控制器的创建方法

0

对于有类似的问题,这也可能有助于看看Rails的2.3.x版本的源代码the source code for the remote helpers

在我的情况,我想弄清楚如何做的“:更新”参数,如:

remote_form_for(@obj, :update => "new_obj", :before => "some js code") do |f| 

我必须找到在remote_function code更新功能。


对于我的具体问题,看起来它是不可能得到的:update使用Rails 3 UJS助手相当。 Rails 3中的rails.jsAjax.Request(...)包装:remote => true请求,而Rails 2中的:update函数用Ajax.Updater(...)包装Ajax请求。对于找人来代替从梁2的:update功能,我看到两个选项:

  • 切换到jQuery的轨道,这样就可以访问来自Ajax请求的响应,这样的代码:

    $("#elem").bind("ajax:complete", function(et, e){ 
        $("#results").html(e.responseText); 
    }); 
    
  • 编写自己的基于Prototype的代码来抓取表单并通过ajax提交,使用Ajax.Updater(...)而不是Ajax.Request。请勿使用:remote => true,因为这会尝试使用Ajax.Request

附注:我在ajax:complete事件

$('new_obj').observe('ajax:complete', function(request){ 
    console.info(request); 
}); 

request对象不会出现在任何地方包含它的响应中提供的回调对象发挥各地。不过,它非常庞大,所以我可能是错的。不过希望这会帮助别人试图从Rails 2升级到3。

0

有一种方法可以从Ajax.Request调用中获取响应,如果您使用的是remote_form_for:update选项。因此,您可能不需要将其更改为使用Ajax.Updater作为解决方法。基本上,你使用respone.memo.responseText,在你的例子中它会是这样的:

$('new_obj').observe('ajax:complete', function(response){ 
    console.info(response.memo.responseText); 
    // Probably you would use it like this: 
    $('new_obj').update(response.memo.responseText); 
});