Как исправить или инициализировать константу CsvImporter::Отчет

#ruby-on-rails #ruby #csv

#ruby-on-rails #ruby #csv

Вопрос:

У меня есть следующий код ниже, и когда я запускаю задачу rake, она выдает ошибку NameError: uninitialized constant CsvImporter::Report

lib/user/csv_importer.rb

 # frozen_string_literal: true

require 'open-uri'
require 'csv'

class CsvImporter
  Report < Struct.new(:users) do
    def valid_count
      @valid_count ||= users.count(amp;:persisted?)
    end

    def invalid_count
      @invalid_count ||= total - valid_count
    end

    def total
      @total ||= users.count
    end

    def errors
      users.map do |user|
        user.errors.full_messages.to_sentence
      end.to_sentence
    end
  end

  def initialize(file_path)
    @file_path = file_path
  end

  def call
    users = valid_rows.map do |row|
      User.create(roles: [Role.find_or_create_by(name: row[:role])], email: row[:email])
    end

    Report.new(users)
  end

  private

  attr_accessor :file_path

  def valid_rows
    CSV.foreach(file_path, headers: true, header_converters: :symbol).select do |row|
      row[:email].present? amp;amp; row[:password].present?
    end
  end
end
 

задача / пользователь/csv_importer.rake

 # frozen_string_literal: true

require 'user/csv_importer'


namespace :user do
  desc "Import data from CSV file into User's table"
  task import_user: :environment do
    file_path = (File.join Rails.root, 'doc', 'user', 'user.csv')

    CsvImporter.new(file_path).call
  end
end
 

Ответ №1:

Вам нужно изменить

 Report < Struct.new(:users) do
 

Для

 Report = Struct.new(:users) do
 

Комментарии:

1. Это работает. Спасибо. Но Rubocop жаловался Constant name Report doesn't match Regex

2. Вы можете отключить определенную конфигурацию rubocop, встроив или добавив rubocop.yml