2011-03-22 27 views
2

我試圖用RJS替換DOM中的div。這裏是我試圖代碼, 該控制器具有此方法:如何使用AJAX替換Rails 3中的div?

def change 
    render :update do |page| 
    page.replace(:test_id, :partial => "input",:locals =>{ :type => 'text', :name => 'user[user][contactinfo][city]', :val => "", :size => '244', :placeholder_text => 'Yes it is working...'}) 
    end 
end 

該視圖包含:

<div id = "test_id"></div> 
<%= link_to "AJAX", "/poc/change", :remote => true %> 

現在我想更換div id="test_id"與提到的部分。

輸出我得到的是:

try { 
Element.replace("test_id", "<input type=\"text\" id=\"user[user][contactinfo][city]\" name=\"user[user][contactinfo][city]\" value=\"\" placeholder=\"Yes it is working...\" style=\"width:244px; height:33px; border:0; color:#646464; background:url(/images/form_textfield_244.png) 0 5px no-repeat; padding:12px 5px 0 5px; margin:0 0 10px 0;\" />\n"); 
} catch (e) { alert('RJS error:\n\n' + e.toString()); alert('Element.replace(\"test_id\", \"<input type=\\\"text\\\" id=\\\"user[user][contactinfo][city]\\\" name=\\\"user[user][contactinfo][city]\\\" value=\\\"\\\" placeholder=\\\"Yes it is working...\\\" style=\\\"width:244px; height:33px; border:0; color:#646464; background:url(/images/form_textfield_244.png) 0 5px no-repeat; padding:12px 5px 0 5px; margin:0 0 10px 0;\\\" />\\n\");'); throw e } 

這在瀏覽器中看到。任何人都可以解釋我出錯的地方嗎?預期的輸出是div應該替換爲替換的任何東西。

回答

6

我建議你不要再使用RJS了。更好的是生成一個JS視圖,你想要你的JavaScript做。

例如,如果你使用jQuery,您可以添加一個文件:在裏面你加你的Javascript

changes.js.erb

$('#test_id').html("<%= escape_javascript(render :partial => "input",:locals =>{ :type => 'text', :name => 'user[user][contactinfo][city]', :val => "", :size => '244', :placeholder_text => 'Yes it is working...'}) %>") 

現在,如果你撥打的/ proc/change.js你可以看到生成的JS,如果你在頁面中做一些JS。

+0

RJS有什麼問題? – 2011-03-22 13:59:05

+0

@AashishP RJS被棄用和錯誤,因爲它爲你生成JS。與不顯眼的JS模式,你寫你自己的JS,因此你可以控制你的事件綁定。 RJS也迫使你通過線路發送JS,這是一個壞主意,因爲它依賴於瀏覽器來正確執行JS,而JS從來不這樣做。通過線路發送JSON或HTML數據更可靠,然後對'ajax:success'回調執行任何額外處理。你應該*永遠不會*發送HTML和附帶的內聯JS在相同的響應,除非你喜歡解決'$是未定義的錯誤... – tubbo 2012-05-21 19:19:53

+0

是否有無論如何也取代div的ID? – wachichornia 2012-08-03 13:48:48