[RUBY] So geben Sie die von Rails erstellte CSV in S3 aus

Ich habe die Funktion implementiert, um die von Rails erstellte CSV neulich auf S3 hochzuladen. Ich hatte mehr Rücksicht als ich erwartet hatte, also werde ich den Inhalt zusammenfassen.

Umgebung

Rails 5.2.3 Ruby 2.6.3

Annahme

Ich erwarte nicht, CSV in Excel zu überprüfen

Einführung von Edelstein

Sie müssen das Gem installieren, um über Rails auf AWS zugreifen zu können. Fügen Sie Ihrem Gemfile Folgendes hinzu:

Gemfile


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

Eine gemeinsame Klasse erstellen

Ich wollte die diesmal erstellte CSV-Ausgabefunktion als allgemeine Logik verwenden. Erstellen Sie daher eine Datei mit dem Namen "output_csv.rb" in "/ app / lib". Definieren Sie die Klasse in output_csv.rb wie folgt. Alle Methoden dieser Klasse sollten Klassenmethoden sein.

app/lib/output_csv.rb


require 'csv'
require 'nkf'

class OutputCsv
  class << self
    #Fügen Sie hier Methoden hinzu
  end
end

Implementierung der Ausgabemethode in S3

Erstellen Sie eine Methode zur Ausgabe an S3. Die als Parameter empfangene CSV-Zeichenfolge wird an S3 ausgegeben. Der Teil zur Erstellung von CSV-Zeichenfolgen wird später beschrieben.

app/lib/output_csv.rb


#CSV-Ausgabemethode-- ①
def save_csv(data)
  #Der Dateiname lautet'Zufällige Zeichenfolge_Zeitstempel.csv'Zu
  file_name = "#{SecureRandom.urlsafe_base64(9)}_#{Time.current.strftime('%Y%m%d%H%M%S')}.csv"
  #Ausgabe in einen Ordner namens csv direkt unter dem Bucket
  file_full_path = "csv/#{file_name}"

  #CSV-Ausgabe lokal in der Entwicklungsumgebung und an S3 in der Produktionsumgebung-- ②
  if Rails.env.development?
    File.open(Rails.root.join('tmp', file_name), 'w') do |f|
      #Konvertieren Sie den Zeichencode mit NKF-- ③
      f.puts(NKF.nkf('-x -w', data))
    end
  else
    #S3-Client-Instanziierung-- ④
    s3 = Aws::S3::Client.new
    #CSV an S3 ausgeben-- ⑤
    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) Definition der CSV-Ausgabemethode. Empfängt die CSV-Zeichenfolge, die als Parameter (Daten) ausgegeben werden soll.

def save_csv(data)

(2) Dieses Mal erfolgt die Ausgabe lokal in der Entwicklungsumgebung und an S3 in der Produktionsumgebung. Wenn Sie auch in der Entwicklungsumgebung in S3 ausgeben möchten, ist dieser Zweig nicht erforderlich.

NKF wird zum Konvertieren der Zeichenfolge verwendet.

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

Die ersten Argumente -x und -w geben die folgenden Konvertierungen an. -x: Ausgabe ohne Konvertierung von Katakana halber Breite in Katakana voller Breite -w: Ausgabe mit utf-8

(4) Erstellen einer Instanz des S3-Clients. Verwenden Sie diese Option, um auf S3 zuzugreifen.

s3 = Aws::S3::Client.new

Beachten Sie, dass wir hier keine Parameter an den Konstruktor übergeben haben. Der Grund dafür ist, dass die Rolle der EC2-Instanz, auf der diese Rails-Anwendung ausgeführt wird, über die Berechtigung zum Schreiben in S3 verfügt, sodass die Berechtigung nicht berücksichtigt werden muss.

Wenn Sie auf S3 mit IAM-Benutzerrechten anstelle von Rollen zugreifen möchten, müssen Sie den Zugriffsschlüssel und den geheimen Schlüssel wie unten gezeigt angeben.

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

⑤ Erstellen Sie eine CSV-Datei in S3.

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

Ich benutze eine Methode namens put_object. Der Inhalt jedes Parameters ist wie folgt.

-Bucket: Der Name des auszugebenden Buckets. Hier basiert die Beschreibung auf der Annahme, dass die Umgebungsvariable "AWS_S3_BUCKET" gesetzt ist. -Taste: Geben Sie den Namen des Ausgabeverzeichnisses + den Dateinamen an. -Körper: Gibt die oben erläuterte Zeichenfolge aus, die von NKF konvertiert wurde. -Inhaltstyp: Das Dateiformat wird angegeben. Wenn Sie hier nicht explizit angeben, dass es sich um eine CSV-Datei handelt, wird sie in S3 nicht als CSV-Datei erkannt.

Erstellen einer CSV-Zeichenfolge

Erstellen Sie eine CSV-Zeichenfolge, übergeben Sie die erstellte Zeichenfolge an die oben erstellte Methode save_csv und erstellen Sie eine Methode zur Ausgabe einer CSV-Datei.

Die zu erstellende Methode empfängt Header- und Datenelemente als Parameter, konvertiert sie in CSV-Zeichenfolgen und gibt sie als Datei aus.

app/lib/output_csv.rb


#Methode zur Erstellung von CSV-Zeichenfolgen-- ①
def execute(headers, values)
  output = CSV.generate do |csv|
    #Header-Ausgabe-- ②
    csv << headers
    #Ausgabe von Datenelementen-- ③
    values.each do |value|
      csv << value
    end
  end

  #CSV-Dateiausgabe-- ④
  save_csv(output)
end

(1) Definition der Methode zur Erstellung von CSV-Zeichenfolgen. Empfängt ein Array von Headern und Datenelementen als Parameter. Zum Beispiel, wenn Sie die folgende CSV erstellen möchten

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

Erstellen Sie ein Array wie das folgende und übergeben Sie es an die Parameter.

#Header
headers = ['id', 'name','age']
#Datenelement
values = []
values.push([1, 'hoge', 20])
values.push([2, 'fuga', 31])
values.push([3, 'foo', 43])

OutputCsv.execute(headers, values)

(2) Der Wert des vom Parameter empfangenen Headers wird in CSV eingestellt.

(3) Das vom Parameter empfangene Datenelement wird in CSV eingestellt. Da es sich um ein Array handelt, wird es Zeile für Zeile herausgenommen und festgelegt.

(4) Übergeben Sie die erstellte CSV-Zeichenfolge an die oben erstellte Methode save_csv und geben Sie sie an S3 aus.

Alle Codes

Der gesamte Code ist unten. Die save_csv-Methode sollte nicht von außen aufgerufen werden, daher wird sie privat gemacht.

app/lib/output_csv.rb


require 'csv'
require 'nkf'

class OutputCsv
  class << self
    def execute(headers, values)
      output = CSV.generate do |csv|
        #Header-Ausgabe
        csv << headers
        #Ausgabe von Datenelementen
        values.each do |value|
          csv << value
        end
      end

      #CSV-Dateiausgabe
      save_csv(output)
    end

    private

    def save_csv(data)
      #Der Dateiname lautet'Zufällige Zeichenfolge_Zeitstempel.csv'
      file_name = "#{SecureRandom.urlsafe_base64(9)}_#{Time.current.strftime('%Y%m%d%H%M%S')}.csv"
      #
      file_full_path = "csv/#{file_name}"

      #
      if Rails.env.development?
        File.open(Rails.root.join('tmp', file_name), 'w') do |f|
          #
          f.puts(NKF.nkf('-x -w', data))
        end
      else
        #
        s3 = Aws::S3::Client.new
        #
        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

Ausgabe in einen Ordner mit dem Namen csv direkt unter dem Bucket Lokale Ausgabe in der Entwicklungsumgebung, CSV-Ausgabe in S3 in der Produktionsumgebung Konvertieren des Zeichencodes mit NKF Erstellen einer Instanz des S3-Clients Ausgabe CSV in S3 Verwendung

CSV-Dateiausgabe

Geben Sie die Datei in S3 aus.

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)

Überprüfen Sie die Dateiausgabe an S3

Die CSV-Datei wird wie unten gezeigt in den angegebenen Bucket und das angegebene Verzeichnis ausgegeben.

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

Überprüfen Sie den Inhalt der Datei

Wenn Sie die Dateiausgabe in S3 herunterladen und den Inhalt überprüfen, sieht dies wie folgt aus. スクリーンショット 2020-09-18 16.30.33.png

Recommended Posts

So geben Sie die von Rails erstellte CSV in S3 aus
[Rails] So bestimmen Sie das Ziel anhand von "Rails-Routen"
Wie schreibe ich Rails
So deinstallieren Sie Rails
So trennen Sie .scss nach Controller in Rails
So laden Sie Bilder von AWS S3 herunter (Rails, Carrierwave)
[Schienen] Wie poste ich Bilder?
[Rails] Verwendung von Enum
Wie man Schienenrouten liest
Verwendung von Rails Join
So beenden Sie den Rails-Server
Wie schreibe ich Rails Seed
[Rails] Verwendung der Validierung
[Schienen] So deaktivieren Sie Turbolinks
[Rails] So verwenden Sie authenticate_user!
[Rails] So implementieren Sie Scraping
[Schienen] Wie man Samen macht
Wie schreibe ich Rails Routing
[Rails] So installieren Sie simple_calendar
Output Rails Routes als CSV
[Rails] So installieren Sie reCAPTCHA
[Schienen] Verwendung von Scope
Laden der mit der Xib-Datei erstellten Benutzeroberfläche in View
[Rails] Verschiedene Unterschiede zwischen redirect_to und Render-Methode und Ausgabemethode der Render-Methode
[Rails] So zeigen Sie eine Liste der Beiträge nach Kategorie an
[Rails] Wie man Edelstein "devise" benutzt
[Schienen] Verwendung von Geräten (Hinweis)
[Rails] Verwendung von Flash-Nachrichten
[Rails] Anzeigen von Datenbankinformationen
[Schienen] So verhindern Sie den Bildschirmübergang
Verwendung von Ruby on Rails
So stellen Sie Bootstrap auf Rails bereit
[Rails] So beschleunigen Sie das Docker-Compose
[Ruby on Rails] CSV-Ausgabefunktion
[Schienen] So fügen Sie neue Seiten hinzu
[Rails] Wie schreibe ich eine Ausnahmebehandlung?
[Rails] So installieren Sie ImageMagick (RMajick)
[Rails] So installieren Sie Font Awesome
[Rails] Verwendung von Active Storage
So installieren Sie jQuery in Rails 6
[Rails] So implementieren Sie die Sternebewertung
[Einführung in Rails] Verwendung von Render
So installieren Sie Swiper in Rails
[Rails / Routing] So verweisen Sie auf den Controller in Ihrem eigenen Verzeichnis
[R Spec on Rails] So schreiben Sie Testcode für Anfänger von Anfängern
[Rails] So laden Sie Bilder mit Carrierwave und Fog-Aws in AWS S3 hoch
[Rails] So laden Sie Bilder mit refile und refile-s3 in AWS S3 hoch
So verhindern Sie die doppelte Verarbeitung durch addEventListener
So implementieren Sie Suchfunktionen in Rails
So ändern Sie den App-Namen in Rails