2017-09-22 11 views
0

CSVファイルをインポートして新しいレコードを作成し、適切な関連付けを行う方法を理解しようとしています。 belongs_toの作物:
1)ファーマー(にhas_many:農場)
2)ファーム(has_manyの農家)
3)クロップ(belongs_toの:ファーム)
Rails CSV import-association params

私は3つのモデルを持っています

目的は、ユーザーに各ファームを手動で作成させてから、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" %> 

farms#showページで@ farm.idを送信して、ファイルと共に作物をインポートしますか?
これをフォームやその他の方法で行うのが最善でしょうか?

答えて

0

これはいくつかの方法で行うことができます。ルートの設定方法によって異なります。

あなたは

resources :farms do 
    resources :crops 
end 

import_crops_path(@farm、@crop)のようなものを持っている場合の線に沿ってURLを生成します/農場/:することができます両方のオプションを持つ

新しいfarm_id /作物/ params [:farm_id]でファームIDを取得

もう1つのオプションは、非表示フィールドを使用することです。 [:farm_id]

f.hidden_field(:farm, :id) 

これはあなたのparamsとファームIDを取得することができます両方のオプションを持つHTMLフィールド

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

を作成します

参照

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

+0

Jon、ありがとう - これは提案されたネスティングが修正されました。私の唯一の懸念は、私があまりにも多くのものを入れ子にしていることです。これは悪い習慣ですか? 'resources:farms do resources:crops do コレクション{post:import} end end' – user1510700