Rails 5-如何将数据从 xls 文件导入数据库
Posted
技术标签:
【中文标题】Rails 5-如何将数据从 xls 文件导入数据库【英文标题】:Rails 5- How to import data from an xls file to the database 【发布时间】:2016-12-17 05:23:04 【问题描述】:我正在尝试弄清楚如何将 xls 文件中的数据添加到我的 rails 5 psql 数据库中。
我曾尝试遵循 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])
下一个预感:我的资源是嵌套的。 Randd 是顶层,field 是子级。
模型被调用:
class Randd::Field < ApplicationRecord
控制器被调用:
class Randd::FieldsController < ApplicationController
控制器中允许的参数定义为:
params.fetch(:randd_field, ).permit(:title, :anz_reference)
表格使用以下开头行:
<%= simple_form_for @field, multipart: true do |f| %>
错误消息中突出显示的行有:
Randd::Field.create(params[:randd_field][:file])
我想知道问题是否与在其中一些地方使用 randd_field 和表单中的 @field 有关?如果我尝试将其更改为 @randd_field 并且我不知道在哪里可以找到有关如何以任何完整、准确的形式使用命名空间的 ruby 或 rails 规则,则该表单不起作用。
谁能帮忙看看这里出了什么问题?或者,是否有人参考了不依赖于我猜测缺少的步骤或如何将其转换为用于 xls 而不是 .csv 文件的完整教程?
【问题讨论】:
【参考方案1】:您可以使用一些 ruby xls 解析器。 Creek、Simple Spreadsheet 和 Roo。
【讨论】:
以上是关于Rails 5-如何将数据从 xls 文件导入数据库的主要内容,如果未能解决你的问题,请参考以下文章