Rails 5 - 如何将数据从xls文件导入到数据库
我想弄清楚如何将数据从xls文件添加到我的rails 5 psql数据库。Rails 5 - 如何将数据从xls文件导入到数据库
我试图遵循GoRails教程 - 但这些教程很快变得无关紧要,因为它们使用在应用程序中创建的某个地方创建的CSV文件来完成教程。我不知道如何将我的xls数据转换为csv数据以跟随该教程。
我也尝试了这些教程中的每一个。我无法让他们工作。
我试过this tutorial和this one和this one。我无法让他们工作。
对我在第一篇教程的博客上发布的问题的回复说,要采取在帖子中未列出的步骤。对我来说,我一点都不明白,我应该一步一步地填补空白。
我概述了我在这SO post中的工作。我无法找到帮助让xls上传工作。所以,我再次提出求助要求 - 考虑到第一篇SO帖子变得非常长,以及我为实施建议的解决方案所做的各种尝试。
我:
class Randd::Field < ApplicationRecord
require 'csv'
# def self.import(file)
# CSV.foreach(file.path, headers: true) do | row |
# Randd::Field.create! row.to_hash
# end
# end
def self.create(file)
CSV.foreach(file.path, headers: true) do |row|
randd_field_hash = row.to_hash # exclude the price field
randd_field = Randd::Field.where(id: randd_field_hash["id"])
if randd_field.count == 1
randd_field.first.update_attributes(randd_field_hash)
else
Randd::Field.create! row.to_hash#(randd_field_hash)
end # end if !product.nil?
end # end CSV.foreach
end # end self.import(file)
首先预感:在这个模型中,我需要 'CSV'。我是否需要'xls'或其他东西,因为我实际上没有任何可以导入的逗号分隔值列表?
的routes.rb
namespace :randd do
resources :fields do
collection do
post :create
end
end
end
控制器:
class Randd::FieldsController < ApplicationController
def index
@randd_fields = Randd::Field.all
end
def new
@field = Randd::Field.new
end
def create
# @field = Randd::Field.new(randd_field_params)
Randd::Field.create(params[:randd_field][:file])
redirect_to action: "index", notice: "Data imported"
end
def show
redirect_to action: "index"
end
索引视图:
<table class="table table-bordered">
<tr>
<td> <h5>Title</h5> </td>
<td> <h5>Reference (ANZ)</h5> </td>
<td> <h5>Added</h5> </td>
<%# if policy(@package_ips).update? %>
<td> <h5>Manage this asset</h5></td>
<%# end %>
</tr>
<% @randd_fields.each do | field | %>
<td> <%= field.title %> </td>
<td> <%= field.anz_reference %> </td>
<td> <%= field.created_at.try(:strftime, '%e %B %Y') %> </td>
<% end %>
</tr>
</table>
上面显示出所有我试图用得到这个各种选项的注释组件上班。
# def import
# # byebug
# # Randd::Field.import(params[:file])
# # Randd::Field.create(params[:randd_field]['file'])
# # redirect_to action: "index", notice: "Data imported"
# end
private
def randd_field_params
params.fetch(:randd_field, {}).permit(:title, :anz_reference)
end
end
我的形式有:
<%#= simple_form_for (@field), multipart: true do |f| %>
<%= simple_form_for @field, multipart: true do |f| %>
<%= f.error_notification %>
<div class="form-inputs" style="margin-bottom: 50px">
<div class="row">
<div class="col-md-12">
<div class="form_title">Research Field Codes</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<%= f.file_field :file %>
</div>
</div>
</div>
<div class="row">
<div class="col-md-10 col-md-offset-1" style="margin-top: 50px">
<div class="form-actions">
<%= f.button :submit %>
</div>
</div>
</div>
<% end %>
认为出现了这种尝试的错误消息称:
NoMethodError - undefined method `[]' for nil:NilClass:
app/controllers/randd/fields_controller.rb:13:in `create'
13我创建行动的线说:
Randd::Field.create(params[:randd_field][:file])
下一个预感:我的资源是n相关捐资。兰德是最高级别的领域是孩子。
该模型被称为:
class Randd::Field < ApplicationRecord
该控制器被称为:
class Randd::FieldsController < ApplicationController
在控制器允许的PARAMS被定义为:
params.fetch(:randd_field, {}).permit(:title, :anz_reference)
的形式使用该开口line:
<%= simple_form_for @field, multipart: true do |f| %>
这是在错误信息中强调的线路有:
Randd::Field.create(params[:randd_field][:file])
我不知道这个问题有事情做,在这些地方使用randd_field,只是@field形式?如果我尝试将其更改为@randd_field,并且我不知道在哪里可以找到ruby或rails规则,以了解如何以完整,准确的形式使用名称空间,则表单不起作用。
任何人都可以帮忙看看这里有什么问题吗?或者,任何人都有一个参考完整教程,不依赖于我猜测缺少的步骤是什么或如何将其转换为使用xls而不是.csv文件?
有几个ruby xls解析器可以使用。溪,简单的电子表格和Roo。