Rails 5 - 如何将数据从xls文件导入到数据库

问题描述:

我想弄清楚如何将数据从xls文件添加到我的rails 5 psql数据库。Rails 5 - 如何将数据从xls文件导入到数据库

我试图遵循GoRails教程 - 但这些教程很快变得无关紧要,因为它们使用在应用程序中创建的某个地方创建的CSV文件来完成教程。我不知道如何将我的xls数据转换为csv数据以跟随该教程。

我也尝试了这些教程中的每一个。我无法让他们工作。

我试过this tutorialthis onethis 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。