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
Indexビュー:
<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
私のフォームはあります言う私のcreateアクションの
NoMethodError - undefined method `[]' for nil:NilClass:
app/controllers/randd/fields_controller.rb:13:in `create'
13行目:
Randd::Field.create(params[:randd_field][:file])
<%#= 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 %>
この試みから生じるエラーメッセージが語ります
次の就任:私のリソースはnですested。 Randdはトップレベルで、フィールドは子供です。
モデルが呼び出される:
class Randd::Field < ApplicationRecord
コントローラが呼び出され:
class Randd::FieldsController < ApplicationController
コントローラに許可のparamsは次のように定義される:フォームはこの開口を使用
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に変更しようとすると、フォームは機能しません。名前空間を完全で正確な形式で使用する方法については、ルビまたはレールのルールをどこで見つけるべきかわかりません。
ここで何が間違っているのを見るのに役立ちますか?代わりに、チュートリアルへの参照があります。私は、欠落しているステップが何であるかを推測しませんし、.csvファイルの代わりにxlsを使用して変換する方法はありますか?