Lorsqu'un utilisateur souhaite publier plusieurs données sur l'application, il souhaite pouvoir sélectionner un fichier Excel et l'enregistrer dans la base de données.
rails new sample_app -d postgresql
rails db:create
Créez une nouvelle application avec des rails new et créez une base de données.
rails g controller users index
Créez un contrôleur utilisateur avec une action d'index. Le routeur et la vue sont également créés ensemble.
rails g model user name:string email:string
rails db:migrate
Créez des colonnes de nom de type chaîne et d'e-mail dans la table des utilisateurs.
html:app/views/users/index.html.erb
<h1>Liste d'utilisateur</h1>
<table>
<thead>
<tr>
<th>ID</th>
<th>Nom</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 %>
Post-génération du formulaire. Il n'enregistre pas le fichier lui-même, mais permet à l'utilisateur d'être enregistré avec l'action: importer qui a envoyé les paramètres [: fichier].
config/routes.rb
Rails.application.routes.draw do
resources :users do
collection do
post :import
end
end
end
Ajoutez le routage pour l'action: import de la méthode Post à l'utilisateur.
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
L'action d'indexation est la même que lors de l'utilisation de l'échafaudage, obtenez tous les enregistrements et attribuez-les à @users. L'action d'importation prend les paramètres [: fichier] et utilise la méthode d'importation pour créer un enregistrement dans la table des utilisateurs. Écrivez la définition de la méthode d'importation dans le modèle.
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
Puisqu'il s'agit d'une méthode modèle du modèle User, elle est définie sous la forme def self.import. params [: file] .tempfile contient le chemin du fichier envoyé. Lisez le fichier avec Roo :: Excelx.new (file.tempfile) et affectez-le à la variable xlsx. Exécute le traitement pour chaque ligne du fichier lu par la méthode each_row_streaming. Avec l'option de décalage, vous pouvez spécifier le nombre de lignes à ignorer le traitement (ignorer le champ d'élément sur la première ligne). Si le même identifiant existe dans la table des utilisateurs dans next if self.pluck (: id) .include? (User.id), le processus est ignoré.
Préparez-vous à utiliser gem roo.
Gemfile
gem "roo" #Postscript
Installation groupée dans le terminal. Ajoutez également require "roo" à config / application.rb
config/application.rb
#réduction
require 'rails/all'
require "roo"
#réduction
C'est acceptable.
Démarrez le serveur, accédez à "http: // localhost: 3000 / users" et vérifiez l'écran.
Vous pouvez enregistrer des données à partir des fichiers Excel suivants en appuyant sur Sélectionner un fichier. Après l'enregistrement, vérifiez que l'écran a changé comme suit.
https://qiita.com/seitarooodayo/items/c9d6955a12ca0b1fd1d4 https://qiita.com/guri3/items/f20487516311b2a3db37 C'était vraiment utile! Je vous remercie!
Je vais l'appliquer et créer une fonction pour enregistrer la liste des employés à la fois dans l'application.
Recommended Posts