2010-06-02 56 views
0

我使用Rails與jQuery,我正在打印一個簡單的網站頁面打印每個記錄到表。每個記錄的唯一可編輯字段是複選框。我的目標是每次更改複選框時,ajax請求都會更新記錄的布爾屬性(即不提交按鈕)。Rails控制器無法呈現正確的視圖時,形式強制提交的Javascript

我的視圖代碼:

<td> 
<% form_remote_tag :url => admin_update_path, :html => { :id => "form#{lead.id}" } do %> 
    <%= hidden_field :lead, :id, :value => lead.id %> 
    <%= check_box :lead, :contacted, :id => "checkbox"+lead.id.to_s, :checked => lead.contacted, :onchange => "$('#form#{lead.id}').submit();" %> 
<% end %> 
</td> 

在我的routes.rb,admin_update_path由

map.admin_update 'update', :controller => "admin", :action => "update", :method => :post 

定義我也有一個RJS模板渲染還原更新。這個文件的內容,目前只用於測試(我只是想看看它是否正常工作,這不會是一個成功保存的終極功能)...

page << "$('#checkbox#{@lead.id}').hide();" 

點擊時,Ajax請求是成功發送正確的參數,控制器上的動作可以檢索記錄並更新它。 問題是它不發回JS;它會更改瀏覽器中的頁面,並將生成的Javascript呈現爲純文本而不是原地執行。

Rails做了一些幕後的工作來確定傳入的請求是否是ajax調用,並且我無法弄清楚爲什麼它將傳入請求解釋爲常規Web請求而不是ajax請求。

我可能在這裏錯過了一件非常簡單的事情,但我很好看,所以我想我會再要一雙眼睛。在此先感謝您的任何信息!

回答

0

此問題與this one有關,但答案略有不同。我不得不創建一個提交表單的新方法,因爲默認的jQuery submit()方法不會作爲'腳本'提交,並且當然不會觸發Rails在onsubmit =「...」處理程序中通過form_remote_tag助手。

的解決方案是爲鏈接的答案建議創建一個新的功能,但內容略有不同:

jQuery.fn.submitWithAjax = function() { 
    jQuery.ajax({data:jQuery.param(jQuery(this).serializeArray()) + '&amp;authenticity_token=' + encodeURIComponent('<%= form_authenticity_token %>'), dataType:'script', type:'post', url:'/update'}); 
    return false; 
}; 

這是now--注意到我插入軌form_authenticity_token到的Javascript脆權,但真正的方法(後)和網址(/更新)也應該生成,而不是硬編碼。

事情現在正在工作。

0

在您的控制器中,您需要指定正確的響應。既然你沒有發佈控制器,我只是試圖填補空白。

def update 
    # Update something 
    respond_to do |format| 
    format.js # this renders your rjs file 
    end 
end 

指定格式會告訴rails應用程序解釋javascript而不是將其作爲文本發回。

另一種選擇,而不是使用RJS是做一個內嵌RJS阻止這樣的:

render :update do |page| 
    page.replace_html 'user_list', :partial => 'user', :collection => @users 
    page.visual_effect :highlight, 'user_list' 
end 

只能使用inline RJS如果你會做最小的改動界面,可以放入一個或兩條線。更多的東西應該在它自己的rjs文件中。

+0

我更新了控制器以使用明確的respond_to塊,並且得到相同的響應:生成的JS在瀏覽器中顯示爲純文本。我認爲問題在於,當我使用jQuery來處理.submit()表單時,它並未運行由form_remote_tag助手定義的onsubmit =「...」代碼。這只是定期提交表格。這提示我問:爲什麼在使用jQuery調用$(form).submit()時,表單元素中的onsubmit值不會被執行? – whazzmaster 2010-06-03 15:46:32

相關問題