2009-11-16 70 views
3

我在包含一些文件字段的大屁股形式上使用jQuery Form Plugin。後端是Ruby on Rails。jQuery表格插件+ Ajax文件上傳+導軌

即使我相信我設置正確,但我無法讓Rails將POST請求類型識別爲'text/javascript'。

的形式如下:

<form id="listing_form" method="POST" enctype="multipart/form-data" action="/listings"> 
    <input type="text" size="30" name="listing[venue][phone]" id="listing_venue_phone"/> 
    <input type="file" size="30" name="listing[venue][image]" id="listing_venue_image"/> 
    ...plus tons of other fields 

JS的樣子:

$("#listing_form").ajaxForm({ dataType: 'script' }); 

而且我也已經宣佈:

jQuery.ajaxSetup({ 
    'beforeSend': function(xhr) {xhr.setRequestHeader('Accept', 'text/javascript')} 
}); 

請求它對控制器,但Rails的respond_to塊認爲它是一個正常的html請求。此外,Firebug會顯示解析器錯誤,並無法在控制檯中顯示請求和響應標頭。

如果我僅刪除文件字段並僅POST文本字段,respond_to塊會將請求作爲js請求處理並正確執行create.js.erb文件。

我該如何讓Rails正確響應請求?謝謝。

+0

的'jQuery的形式插件dataType'選項是一個代理到'jQuery的'ajax'方法的dataType'選項。這意味着XHR期待帶有text/javascript內容類型的_response_。它與發送的內容無關。 – jason 2009-11-16 08:10:56

+0

感謝您的回覆。我得到了這一部分,我已經編輯了一些帖子來澄清我的問題。 – cinematic 2009-11-16 08:17:40

回答

4

由於JavaScript安全限制,無法通過XHR發送帶有(非空)文件字段的表單。 通常的解決方法是通過發佈到隱藏的iframe來「僞造」ajax表單提交。我相信這也是jQuery Form插件的作用。

使導軌當作實際XHR請求時,這些「假」 AJAX表單提交將被添加在jQuery的表格插件的beforeSubmit回調的特殊參數的一種方法:以

// ... 
beforeSubmit: function(data) { 
    data.push({name: 'accept_js', value: '1'}); 
} 
// ... 
在你的控制器使用

然後過濾器前如預期

before_filter :set_ajax_request 

# ... 

private 
    def set_ajax_request 
    request.format = :js if params[:accept_js] == '1' 
    end 

respond_to方法現在應該工作:當發佈數據中包含的特殊參數設置請求的格式:js

+0

嘿,謝謝你的建議。然而,accept_js參數在將它添加到beforeSubmit和敲擊Rails應用程序之間消失了。這可能與iframe黑客有關。現在跟蹤它... – cinematic 2009-11-16 21:50:09

+0

我跟隨屏幕錄像:http://blog.edgecase.com/2009/6/15/ajax-file-uploads-made-easy-screencast, 並得到它的工作。基本上,我在窗體中添加了一個<$ = hidden_​​field_tag:格式,'js'%>,並安裝了插件。完美的作品。感謝您的建議,它幫助我瞭解發生了什麼,並讓我朝着正確的方向發展。 – cinematic 2009-11-17 02:26:13