2016-12-17 109 views
1

我想弄清楚如何將數據從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文件?

回答

0

有幾個ruby xls解析器可以使用。溪,簡單的電子表格和Roo。

相關問題