2015-09-24 57 views
1

我有一個通過ajax(使用remotipart gem)上傳文件的表單工作正常。我想從服務器作爲JSON的響應,並在瀏覽器上觸發一個JavaScript函數。我怎樣才能做到這一點?我可以更改表單標籤中的設置嗎?ROR - 從控制器請求JSON

查看:

<%= form_tag import_companies_path, remote: true do %> 
    <%= file_field_tag :file %> 
    <%= submit_tag "Import" %> 
<%end%> 

位指示:

def import 
    respond_to do |format| 
     options = { col_sep: ',', converters: :numeric, headers: true } 
     array = [] 
     CSV.foreach(params[:file].path, options) do |row| 
     array.push(row.to_hash) 
     end 
     logger.debug "Parsed CSV companies: #{array.inspect}" 
     format.html { redirect_to companies_path } 
     format.json{ 
     render json: { items: JSON.pretty_generate(array)} 
     } 
     format.js { render js: JSON.pretty_generate(array) } 
    end 
    end 

回答

2

這可以使用多種技術來完成。

其中之一是如正在使用您的形式,只是增加將接收JSON數據的JavaScript函數:

<script> 
    function receiverFunction(data) { 
    console.log(data.name) 
    } 
</script> 
<%= form_tag ... %> 
    ... 
<% end %> 

在你的控制器:

format.js { 
    @data = { name: 'Dora' } 
} 

在你import.js.erb

receiverFunction(<%= @data.to_json.html_safe %>) 

這將轉移@datajson格式到您網頁上的receiverFunction

+0

真棒這工作!另一種選擇是什麼?我想處理ajax成功/錯誤... – Emon

+0

@Emon其他選項有:(1)使用jQuery發送ajax表單提交; (2)以'json'格式回覆而不是'js',但這涉及監聽窗體事件('ajax:complete'),實際上它也不適合使用'remote:true'。我會打賭(1)或我的答案中給出的內容。答案是更多的「Railsy」,然後選項(1)。 – dimakura

+0

還有一種方法是從表單視圖中刪除「receiverFunction」,並在'js'視圖中定義它。但在我看來,這太過分了。 – dimakura