Wenn ein Benutzer mehrere Daten an die App senden möchte, möchte er in der Lage sein, eine Excel-Datei auszuwählen und in der Datenbank zu speichern.
rails new sample_app -d postgresql
rails db:create
Erstellen Sie eine neue App mit neuen Schienen und erstellen Sie eine Datenbank.
rails g controller users index
Erstellen Sie einen Benutzercontroller mit einer Indexaktion. Der Router und die Ansicht werden ebenfalls zusammen erstellt.
rails g model user name:string email:string
rails db:migrate
Erstellen Sie den Namen des Zeichenfolgentyps und die E-Mail-Spalten in der Benutzertabelle.
html:app/views/users/index.html.erb
<h1>Benutzerliste</h1>
<table>
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Email</th>
</tr>
</thead>
<tbody>
<% @users.each do |user| %>
<tr>
<td><%= user.id %></td>
<td><%= user.name %></td>
<td><%= user.email %></td>
</tr>
<% end %>
</tbody>
</table>
<%= form_with url: import_users_path, local: true do |form| %>
<%= form.file_field :file %>
<%= form.submit %>
<% end %>
Generierung nach dem Formular. Die Datei selbst wird nicht gespeichert, der Benutzer kann jedoch mit der Aktion: import registriert werden, die die Parameter [: file] gesendet hat.
config/routes.rb
Rails.application.routes.draw do
resources :users do
collection do
post :import
end
end
end
Fügen Sie dem Benutzer das Routing für die Aktion: import der Post-Methode hinzu.
app/controllers/users_controller.rb
class UsersController < ApplicationController
def index
@users = User.all
end
def import
User.import(params[:file])
redirect_to users_url
end
end
Die Indexaktion ist dieselbe wie bei Verwendung von Scaffold. Rufen Sie alle Datensätze ab und weisen Sie sie @users zu. Die Importaktion verwendet params [: file] und verwendet die Importmethode, um einen Datensatz in der Benutzertabelle zu erstellen. Schreiben Sie die Definition der Importmethode in das Modell.
app/models/user.rb
class User < ApplicationRecord
def self.import(file)
xlsx = Roo::Excelx.new(file.tempfile)
xlsx.each_row_streaming(offset: 1) do |row|
user = self.new(id: row[0].value, name: row[1].value, email: row[2].value)
next if self.pluck(:id).include?(user.id)
user.save
end
end
end
Da es sich um eine Modellmethode des Benutzermodells handelt, wird sie in Form von def self.import definiert. params [: file] .tempfile enthält den Pfad der gesendeten Datei. Lesen Sie die Datei mit Roo :: Excelx.new (file.tempfile) und weisen Sie sie der Variablen xlsx zu. Führt die Verarbeitung für jede Zeile der Datei aus, die von der Methode each_row_streaming gelesen wird. Mit der Option Versatz können Sie die Anzahl der Zeilen angeben, die die Verarbeitung überspringen sollen (das Elementfeld in der ersten Zeile überspringen). Wenn dieselbe ID in der Benutzertabelle in next if self.pluck (: id) .include? (User.id) vorhanden ist, wird der Prozess übersprungen.
Machen Sie sich bereit, Gem Roo zu verwenden.
Gemfile
gem "roo" #Nachtrag
Bundle-Installation im Terminal. Fügen Sie außerdem require "roo" zu config / application.rb hinzu
config/application.rb
#Kürzung
require 'rails/all'
require "roo"
#Kürzung
Das ist in Ordnung.
Starten Sie den Server, greifen Sie auf "http: // localhost: 3000 / users" zu und überprüfen Sie den Bildschirm.
Sie können Daten aus den folgenden Excel-Dateien registrieren, indem Sie auf Datei auswählen klicken. Überprüfen Sie nach der Registrierung, ob sich der Bildschirm wie folgt geändert hat.
https://qiita.com/seitarooodayo/items/c9d6955a12ca0b1fd1d4 https://qiita.com/guri3/items/f20487516311b2a3db37 Es war sehr hilfreich! Vielen Dank!
Ich werde es anwenden und eine Funktion erstellen, um die Mitarbeiterliste sofort in der Anwendung zu registrieren.
Recommended Posts