[RUBY] Comment sortir le CSV créé par Rails vers S3

J'ai implémenté la fonction pour télécharger le CSV créé par Rails vers S3 l'autre jour. J'ai eu plus de considération que prévu, je vais donc résumer le contenu.

environnement

Rails 5.2.3 Ruby 2.6.3

supposition

Je ne m'attends pas à vérifier CSV dans Excel

Introduction de gemme

Vous devez installer le gem pour accéder à AWS à partir de Rails. Ajoutez ce qui suit à votre Gemfile:

Gemfile


gem 'aws-sdk', '~> 3'

Créer une classe commune

Je voulais utiliser la fonction de sortie CSV créée cette fois comme logique commune, alors créez un fichier appelé ʻoutput_csv.rb dans / app / lib`. Définissez la classe dans output_csv.rb comme suit. Toutes les méthodes de cette classe doivent être des méthodes de classe.

app/lib/output_csv.rb


require 'csv'
require 'nkf'

class OutputCsv
  class << self
    #Ajoutez des méthodes ici
  end
end

Implémentation de la méthode de sortie vers S3

Créez une méthode à exporter vers S3. La chaîne de caractères CSV reçue en tant que paramètre est sortie vers S3. La partie de création de chaîne de caractères CSV sera décrite plus loin.

app/lib/output_csv.rb


#Méthode de sortie CSV-- ①
def save_csv(data)
  #Le nom du fichier est'Chaîne aléatoire_Horodatage.csv'À
  file_name = "#{SecureRandom.urlsafe_base64(9)}_#{Time.current.strftime('%Y%m%d%H%M%S')}.csv"
  #Sortie dans un dossier nommé csv directement sous le compartiment
  file_full_path = "csv/#{file_name}"

  #Sortie CSV localement dans l'environnement de développement et vers S3 dans l'environnement de production-- ②
  if Rails.env.development?
    File.open(Rails.root.join('tmp', file_name), 'w') do |f|
      #Convertir le code de caractère à l'aide de NKF-- ③
      f.puts(NKF.nkf('-x -w', data))
    end
  else
    #Instanciation du client S3-- ④
    s3 = Aws::S3::Client.new
    #Sortie CSV vers S3-- ⑤
    s3.put_object(bucket: ENV['AWS_S3_BUCKET'],
                  key: file_full_path,
                  body: NKF.nkf('-x -w', data),
                  content_type: 'text/csv')
  end
end

(1) Définition de la méthode de sortie CSV. Reçoit la chaîne de caractères CSV à afficher en tant que paramètre (données).

def save_csv(data)

(2) Cette fois, la sortie est effectuée localement dans l'environnement de développement et vers S3 dans l'environnement de production. Si vous souhaitez sortir vers S3 même dans l'environnement de développement, cette branche est inutile.

③ La chaîne de caractères est convertie en utilisant NKF.

f.puts(NKF.nkf('-x -w', data))

Les premiers arguments -x et -w spécifient les conversions suivantes. -x: Sortie sans conversion d'un katakana demi-largeur en katakana pleine largeur -w: sortie avec utf-8

(4) Création d'une instance de client S3. Utilisez ceci pour accéder à S3.

s3 = Aws::S3::Client.new

Notez que nous n'avons passé aucun paramètre au constructeur ici. La raison en est que le rôle de l'instance EC2 sur laquelle cette application Rails s'exécute a l'autorisation d'écrire dans S3, il n'est donc pas nécessaire de considérer l'autorisation.

Si vous souhaitez accéder à S3 avec des privilèges d'utilisateur IAM au lieu de rôles, vous devez spécifier la clé d'accès et la clé secrète comme indiqué ci-dessous.

s3 = Aws::S3::Client.new(
  access_key_id: 'your_access_key_id',
  secret_access_key: 'your_secret_access_key'
)

⑤ Créez un fichier CSV sur S3.

s3.put_object(bucket: ENV['AWS_S3_BUCKET'],
              key: file_full_path,
              body: NKF.nkf('-x -w', data),
              content_type: 'text/csv')

J'utilise une méthode appelée put_object. Le contenu de chaque paramètre est le suivant.

-Bucket: le nom du bucket à afficher. Ici, la description est basée sur l'hypothèse que la variable d'environnement ʻAWS_S3_BUCKET` est définie. -Key: Spécifiez le nom du répertoire de sortie + le nom du fichier. -Body: génère la chaîne de caractères convertie par NKF expliquée ci-dessus. -Content_type: Le format de fichier est spécifié. Si vous ne spécifiez pas explicitement qu'il s'agit d'un fichier csv ici, il ne sera pas reconnu en tant que fichier CSV sur S3.

Créer une chaîne CSV

Créez une chaîne de caractères CSV, transmettez la chaîne de caractères créée à la méthode save_csv créée ci-dessus et créez une méthode pour générer un fichier CSV.

La méthode à créer reçoit les éléments d'en-tête et les éléments de données en tant que paramètres, les convertit en chaînes de caractères CSV et les génère sous forme de fichier.

app/lib/output_csv.rb


#Méthode de création de chaîne CSV-- ①
def execute(headers, values)
  output = CSV.generate do |csv|
    #Sortie d'en-tête-- ②
    csv << headers
    #Sortie des éléments de données-- ③
    values.each do |value|
      csv << value
    end
  end

  #Sortie de fichier CSV-- ④
  save_csv(output)
end

(1) Définition de la méthode de création de chaînes de caractères CSV. Reçoit un tableau d'en-têtes et d'éléments de données en tant que paramètres. Par exemple, si vous souhaitez créer le CSV suivant

id,name,age
1,hoge,20
2,fuga,31
3,foo,43

Créez un tableau comme celui ci-dessous et transmettez-le aux paramètres.

#entête
headers = ['id', 'name','age']
#élément de données
values = []
values.push([1, 'hoge', 20])
values.push([2, 'fuga', 31])
values.push([3, 'foo', 43])

OutputCsv.execute(headers, values)

(2) La valeur de l'en-tête reçue par le paramètre est définie en CSV.

(3) La donnée reçue par le paramètre est définie en CSV. Puisqu'il s'agit d'un tableau, il est retiré et défini ligne par ligne.

(4) Passez la chaîne de caractères CSV créée à la méthode save_csv créée ci-dessus et envoyez-la à S3.

Tous les codes

Tout le code est ci-dessous. La méthode save_csv n'est pas censée être appelée de l'extérieur, elle est donc rendue privée.

app/lib/output_csv.rb


require 'csv'
require 'nkf'

class OutputCsv
  class << self
    def execute(headers, values)
      output = CSV.generate do |csv|
        #Sortie d'en-tête
        csv << headers
        #Sortie des éléments de données
        values.each do |value|
          csv << value
        end
      end

      #Sortie de fichier CSV
      save_csv(output)
    end

    private

    def save_csv(data)
      #Le nom du fichier est'Chaîne aléatoire_Horodatage.csv'À
      file_name = "#{SecureRandom.urlsafe_base64(9)}_#{Time.current.strftime('%Y%m%d%H%M%S')}.csv"
      #Sortie dans un dossier nommé csv directement sous le compartiment
      file_full_path = "csv/#{file_name}"

      #Sortie CSV localement dans l'environnement de développement et vers S3 dans l'environnement de production
      if Rails.env.development?
        File.open(Rails.root.join('tmp', file_name), 'w') do |f|
          #Convertir le code de caractère à l'aide de NKF
          f.puts(NKF.nkf('-x -w', data))
        end
      else
        #Instanciation du client S3
        s3 = Aws::S3::Client.new
        #Sortie CSV vers S3
        s3.put_object(bucket: ENV['AWS_S3_BUCKET'],
                      key: file_full_path,
                      body: NKF.nkf('-x -w', data),
                      content_type: 'text/csv')
      end
    end
  end
end

comment utiliser

Sortie de fichier CSV

Exportez le fichier vers S3.

headers = ['id', 'name','age']
values = []
values.push([1, 'AIUEO', 20])
values.push([2, 'Kakikukeko', 31])
values.push([3, 'SA Shi Su Se So', 43])

OutputCsv.execute(headers, values)

Vérifiez la sortie du fichier vers S3

Le fichier CSV sera généré dans le compartiment et le répertoire spécifiés, comme indiqué ci-dessous.

スクリーンショット 2020-09-18 16.26.03.png

Vérifiez le contenu du fichier

Si vous téléchargez la sortie du fichier sur S3 et vérifiez le contenu, ce sera comme suit. スクリーンショット 2020-09-18 16.30.33.png

Recommended Posts

Comment sortir le CSV créé par Rails vers S3
[Rails] Comment décider de la destination par "voies ferrées"
Comment écrire des rails
Comment désinstaller Rails
Comment séparer .scss par contrôleur dans Rails
Comment télécharger des images depuis AWS S3 (rails, carrierwave)
[rails] Comment publier des images
[Rails] Comment utiliser enum
Comment lire les itinéraires des rails
Comment utiliser la jonction de rails
Comment terminer le serveur de rails
Comment écrire des graines de Rails
[Rails] Comment utiliser la validation
[Rails] Comment désactiver les turbolinks
[Rails] Comment utiliser authenticate_user!
[Rails] Comment mettre en œuvre le scraping
[Rails] Comment faire des graines
Comment écrire le routage Rails
[Rails] Comment installer simple_calendar
Routes de rails de sortie en tant que csv
[Rails] Comment installer reCAPTCHA
[Rails] Comment utiliser Scope
Comment charger l'interface utilisateur créée avec un fichier Xib dans View
[Rails] Différentes différences entre redirect_to et méthode de rendu et méthode de sortie de la méthode de rendu
[Rails] Comment afficher une liste de messages par catégorie
[Rails] Comment utiliser la "devise" des gemmes
[Rails] Comment utiliser l'appareil (Remarque)
[Rails] Comment utiliser les messages flash
[rails] Comment afficher les informations de base de données
[Rails] Comment empêcher la transition d'écran
Comment utiliser Ruby on Rails
Comment déployer Bootstrap sur Rails
[Rails] Comment accélérer la composition de docker
[Ruby on Rails] Fonction de sortie CSV
[Rails] Comment ajouter de nouvelles pages
[Rails] Comment écrire la gestion des exceptions?
[Rails] Comment installer ImageMagick (RMajick)
[Rails] Comment installer Font Awesome
[Rails] Comment utiliser Active Storage
Comment installer jQuery dans Rails 6
[Rails] Comment mettre en œuvre le classement par étoiles
[Introduction aux rails] Comment utiliser le rendu
Comment installer Swiper in Rails
[Rails / Routing] Comment faire référence au contrôleur dans votre propre répertoire
[R Spec on Rails] Comment écrire du code de test pour les débutants par les débutants
[Rails] Comment télécharger des images sur AWS S3 à l'aide de Carrierwave et de fog-aws
[Rails] Comment télécharger des images sur AWS S3 à l'aide de refile et refile-s3
Comment éviter le traitement en double par addEventListener
Comment implémenter la fonctionnalité de recherche dans Rails
Comment changer le nom de l'application dans les rails