2015-06-15 97 views
3

我有一個控制器querys與行動send_file。 querys_controller.rb軌道:通過2D陣列link_to

def send_file 
    send_data(params[data], :filename => "query.txt") 
end 

在html.erb我:

<%=link_to "send data", :controller=>"querys", :action=>"send_file", :data=>@mat, method: :post%> 

通過點擊「發送數據」軌道顯示我「錯誤的請求」,因爲這樣的事實,@mat爲2- D數組,看起來我link_to不能發送這樣的結構。我如何將我的矩陣發送給我的控制器?

@mat: 
[["1681", "", "02.05.1955"], ["1680", "", "02.03.1936"], ["1679", "", "26.11.1938"], ["1692", "", "15.05.1958"]] 
+0

變化':數據=> @ mat'到':數據=> {數據:@mat}' –

+0

@ArupRakshit沒有幫助 – Tonja

+0

新的錯誤是什麼? –

回答

0

傳遞一個哈希的形式URL參數時,你應該從參數的休息link_to它們分開:

<% 
    = link_to "send data", 
      {controller: "querys", action: "send_file", data: @mat}, 
      method: :post 
%> 

然而,這將通過數據查詢參數。如果您確實想要將數據作爲POST參數傳遞(例如,如果@mat包含大量數據),則必須使用帶有隱藏字段和提交按鈕的表單標記。

IMO更有效的方法是通過填充@mat所需的參數,重新填充可變服務器端並在send_file中使用它。

在這方面最好的做法是利用軌format功能,例如:

def some_action 
    @mat = populate_mat(params) 
    respond_to do |format| 
    format.html 
    format.txt do 
     send_data(@mat, :filename => "query.txt") 
    end 
    end 
end 

(注:這個工作,你可能會在config/initializers/mime_types.rb註冊txt MIME類型)

然後在some_action.html.erb

<% = link_to "send data", {format: :txt}, class: 'whatever' %> 

這將只在當前url的末尾添加一個.txt擴展,該擴展與REST範例(每個資源一個端點,擴展名指示所需表示形式)很好地配合使用。

您也可以通過format選項的任何URL幫手,例如:

<%= link_to "root", root_path(format: :txt), class: 'whatever' %> 
+0

如果我按照你所說的輸入它,我得到的唯一參數是:{「_method」=>「post」,「authenticity_token」=>「VlQ2IAU2SuDPLqUtdUcdGkFuSABjSPYLBr4W3GFq3EI =」,「action」=>「send_data」,「controller」=> 「clinicdb_querys」,「locale」=>「ru」},沒有數據 – Tonja

+0

我的不好,太快讀你的問題。將編輯我的答案。 –

+0

@Tonja完成。這回答了你的問題了嗎 ? –

1

@Tonja,對我來說這似乎是很奇怪的,你在做什麼。首先你在某個地方生成一個數組,然後使用瀏覽器將它傳回給你的應用程序。然後你以文本格式將它發送回瀏覽器? 您不應該將此數組傳遞給用戶,而是將其保留在服務器上。只需將其存儲在數據庫中。不要將數據傳遞給用戶,只有在絕對必要時。你當前的實現也迫使你對傳遞的數據進行一些檢查。

在生成html.erb的控制器方法中,將@mat實例存儲在某處,並獲取記錄的ID。將此ID傳遞給link_to,並使用數據庫中的這些數據作爲send_data調用的參數。 (小提示:實際上不使用ID,這不安全,但使用隨機值,或者更好:如果可以將值附加到current_user,則不傳遞任何東西)。

您收到錯誤的請求,因爲Rails不理解您請求的格式。那是因爲你自己組裝網址。使用電話一樣

link_to "send file", send_file_querys_path(format: :txt) 

甚至

button_to .... 

如果它是一個POST操作。

您可以通過'rake routes'獲得有效的路線。這使得您的應用可以更好地測試。

我希望我的答案能夠幫助你重新修改你的代碼。如果你所做的是正確的,那麼@m_x給了你正確的指針。

此致

雨果

0

嘗試這種情況:

link_to("Send data", send_file_querys_path(data: @mat), method: :post)