2017-09-22 46 views
0

我想弄清楚如何導入CSV文件以創建新記錄並進行相應的關聯。Rails CSV導入 - 關聯參數

我有3種型號:
1)農民(的has_many:農場)
2)農場(的has_many:農作物,belongs_to的:農民)
3)作物(belongs_to的:農場)

目標是讓用戶手動創建每個場,然後通過CSV文件導入作物。我無法弄清楚如何將farm_id傳遞給正在上傳的作物,從而創建關聯。

作物控制器上的導入操作:

def import 
    Crop.import(params[:file], params[:farm_id]) 
    redirect_to root_url, notice: "Crops imported." 
end 

在作物模型導入方法:

def self.import(file, farm) 
     CSV.foreach(file.path, headers: true, encoding:'iso-8859-1:utf-8') do |row| 
     row["farm_id"] = farm 
     Crop.create! row.to_hash 
     end 
    end 

的形式在農場#上傳顯示頁面:

#@farm = Farm.find(params[:id]) 
<%= form_tag import_crops_path, multipart: true do %> 
<%= file_field_tag :file %> 
<%= submit_tag "import CSV" %> 

你怎麼樣在農場#show頁面上發送@ farm.id以將#作物和文件一起導入?
最好是通過表單或其他方式來做到這一點?

回答

0

您可以通過幾種方式來實現,這取決於您的路線是如何設置的。

如果您有類似

resources :farms do 
    resources :crops 
end 

import_crops_path(@farm,@crop)將產生的線沿線的一個url /農場/:farm_id /作物/新

與你既可以選擇使用params [:farm_id]獲取農場ID

另一種選擇是使用隱藏字段。

f.hidden_field(:farm, :id) 

這將創建一個HTML場

<input type="hidden" id="farm_id" name"farm[id]" value="#{@farm.id}" /> 

用這兩個選項,你可以得到使用參數農場ID [:farm_id]

參考

https://apidock.com/rails/ActionView/Helpers/FormHelper/hidden_field http://guides.rubyonrails.org/routing.html

+0

Jon,謝謝 - 這是一個路由問題你建議的嵌套固定。我現在唯一擔心的是我嵌套了太多東西。這是一種不好的做法嗎? '資源:農場做 資源:農作物 集合{post:import} end end' – user1510700