2016-12-17 29 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 

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を使用して変換する方法はありますか?

答えて

0

そこにはいくつかのルビーxlsパーサーがあります。クリーク、シンプルスプレッドシート、およびRoo。

関連する問題