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