2017-09-22 44 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