2010-10-25 56 views
13

我不敢相信我一直在尋找這個簡單的任務四個小時,但我有。Rails 3:簡單的AJAXy頁面更新?

在Rails 2.3,我可以用這個簡單的代碼替換頁面的一個部分:

渲染:更新辦|首頁| page.replace_html 「div_id」:部分=> 「NEW_CONTENT」,... 結束

在Rails 3,瑞恩·貝茨有我寫整個新的JavaScript功能,從原型(軌道默認)到jQuery的切換,以及否則不享受生活。其他的通道不再簡單。

我錯過了什麼?我們如何取代近期的<div>

回答

1

你還有jQuery嗎?我想任何一天推薦它在原型...

如果它仍然存在,你可以只用在你的Javascript以下內容:

$.get("<%= url_for path/to/partial %>", 
     function(response) { 
     $("#div_id").html(response); 
     }); 

這得到通過AJAX的部分,只是轉儲入格id爲div_id。

希望這會有所幫助!

+0

不,現在只是試圖更新到Rails 3,不想今天學習jQuery。 :-) page.replace_html看起來簡單而有效。 – 2010-10-25 16:03:40

+0

不錯啊!不幸的是,我沒有長時間使用RJS或Prototype,以至於我忘記了如何使用它們! – robbrit 2010-10-26 13:33:08

0

我甚至不確定您需要進行AJAX調用來加載該部分。我相信在js.erb文件中,對render(:partial => object_or_path)的調用只會返回一個包含所有html的字符串,您可以將它包裝在一個jQuery對象中並追加。例如:

$('#div_id').html($('<%= render :partial => @object %>')) 
4

整個RJS東西使得內嵌的JavaScript,使DOM非常突兀。此外,通過避免內嵌JavaScript,你可以打開其他可能的方式來優化你的JavaScript由壓縮緩存在瀏覽器中的這些文件。這就是爲什麼RJS超越了rails的範圍3.一天中使用jQuery或Prototype解決一些問題應該讓你瞭解這些小東西,並且將長期幫助這個項目。

12

謝謝,夥計們。官方的答案似乎是這樣的,是的,團隊感到簡單是善良的敵人,並使其更加複雜。

第一個關鍵是創建一個.js.erb文件,命名爲調用ajax更新的方法。因此,如果索引方法處理更新,請將原始JavaScript放入index.js.erb。這在視圖文件夾中。

其次,在index.js.erb的工作代碼爲

m = $('list_users');  
m.innerHTML = "<%= escape_javascript(render :partial => "reload_users") %>"; 

然後撥打電話,添加在控制器方法的respond_to代碼塊,添加:

format.js 

最後,呼叫視圖有:

<%= link_to "Update User List", @reload_users_path, :remote => true %> 

順便說一下,假設所有使用page.replace的舊頁面都會如果你安裝了一個插件,你就可以工作。插件下載頁面表明,它在Rails 3的最新發行版中打破並且尚未修復。另外,如果你使用它,各種博客將會來到你的家和樺樹 - 切換你。

+0

我不確定爲什麼一些rails開發人員認爲.replace_html是「內聯javascript」。它是RPC(遠程過程調用)一個堅實的設計模式。他們只需要將後端轉換爲RPC客戶端/服務器消息傳遞服務,並使客戶端API庫不可知。 – Greg 2012-10-14 02:23:47

-2

試試這個:

page.call "$('#div_id').html", render(:partial => 'new_content') 
+0

答案不明白 – user1972007 2012-12-01 06:06:08

0

據我所知,在同一直線上如上答案,你可以做這樣的事情在你的模板:

<%= link_to "Update User List", @reload_users_path, :remote => true %> 

並在控制器,做到這一點:

respond_to do |format| 
    format.js { 
    render :text => "alert('reloaded')" 
    } 
end 

這樣你可以讓控制器「執行」客戶端JS很像render:upda te用來做。這相當於在Rails 2中執行以下操作:

render :update do |page| 
    page << "alert('reloaded')" 
end 

是否有任何理由不推薦使用此方法?