2011-03-22 58 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); 
});