2011-08-12 54 views
3

我無法弄清楚如何從Rails的這個代碼升級2到Rails 3中:如何將remote_form_for的update =>'div_id'選項從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不再支持遠程form_for的「:update」選項。任何建議?

回答

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的導軌,導軌又名-UJS)遠程鏈接/表單處理程序。 See for yourself.還有很多其他回調/掛鉤可供您使用。如果您希望使這更加靈活,您可以使用live而不是bind,並將其綁定到指示輸出位置的類(例如「側邊欄」),然後所有與sidebar類別的遠程鏈接/表單將其HTML迴應請轉至div#sidebar

+0

謝謝你的建議,但也許我太菜鳥了(我幾個月前開始研究RoR),所以我不能讓你的解決方案工作。我想我需要使用「活」而不是「綁定」,因爲我需要更新表單提交中的div(id =「div_id」)的內容(不一定是成功創建新項目)。有人請寫下一個解決方案,假設這是我第一次使用jQuery?不管怎樣,謝謝你。 – Darme

+1

聽起來像你需要一個教程。去做一個jQuery教程,一個不引人注目的Rails JavaScript教程,另一個用於遠程/ ajax rails請求。那麼這都是有道理的。 – coreyward

+0

好吧,我一定會按照你的建議,因爲jQuery絕對是我的研究清單。我只是希望在短時間內解決這個問題... – Darme

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的情況下,事先沒有可用的id,這使事情變得複雜。

通過clientside JS綁定消除了這個問題。 RJS在某種真空下工作,對客戶的HTML狀態做出假設,並且無法訪問它。

0

我知道這個問題很老,但我在遷移到Rails 3時發現了一個很好的方法,所以我想我會在這裏發佈它,以防其他人處於類似的解決方案。

在佈局/ update_page.js.erb我把這個文件:

$j('#<%[email protected]_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個這樣的調用。