Необходимо сгенерировать мейлер и выполнить шаги по отправке мейла
Table Of Content
Парсинг данных в Rails путем обработки CSV
Приложение Ruby on Rails для парсинга ссылок, загруженных из файла CSV, и поиска их в определенной странице.
В приложении пользователь должен передать CSV-файл и список электронных адресов пользователей, которым будет отправлен разобранный CSV.
В CSV-файле будет три столбца:
-
refferal_link
-
home_link
-
и их значения, как показано ниже
Сначала мы создадим приложение Rails
$ rails new scrape_data
$ cd scrape_data
Затем мы сгенерируем модуль UploadCsv, выполните следующую команду
$ rails g scaffold UploadCsv generated_csv:string csv_file:string
Это создаст все необходимые модели, контроллеры и миграции для csv_file.
Затем мы начнем с загрузки файла в базу данных
замените следующий код в файлах _app/views/upload_csvs/form.html.erb
мы добавили следующий код для загрузки файла в представлении
<%= form_with(model: upload_csv, local: true) do |form| %>
<% if upload_csv.errors.any? %>
<div id=”error_explanation”>
<h2>``<%= pluralize(upload_csv.errors.count, “error”) %>
запрещено сохранение этого upload_csv:</h2>
<ul>
<% upload_csv.errors.full_messages.each do |message| %>
<li>``<%= message %>``</li>
<% end %>
</ul>
</div>
<% end %>
<div class=”field”>
<%= form.label :csv_file %>
<%= form.file_field :csv_file %>
</div>
<div class=”actions”>
<%= form.submit %>
</div>
<% end %>
Затем мы добавим гем для загрузки csv-файла
добавьте следующую строку в файл gem
gem ‘carrierwave’, ‘~> 2.0’
bundle install
Затем мы создадим загрузчик в CarrierWave
rails generate uploader Avatar
мы прикрепим загрузчик к модели
app/models/upload_csv.rb
class UploadCsv `< ApplicationRecord
mount_uploader :csv_file, AvatarUploader
end
прежде чем продолжить, проверьте, работает ли ваше приложение
выполните следующие команды
rake db:create db:migrate
обновите маршруты
Rails.application.routes.draw do
resources :upload_csvs
root ‘upload_csvs#index’
end
rails s
Затем мы создадим задание для чтения CSV-файла и парсинга ссылок из него
и сгенерированный файл будет сохранен в столбце generated_csv этой записи
чтобы создать задание, выполните следующее
rails generate job _genrate__csv
добавьте следующий гем и выполните bundle install
gem ‘httparty’
gem ‘nokogiri’
затем замените код на следующий
class GenrateCsvJob < ApplicationJob
queue_as :default
def perform(upload_csv)
processed_csv(upload_csv)
file = Tempfile.open([“#{Rails.root}/public/generated_csv”, ‘.csv’]) do |csv|
csv << %w[referal_link home_link count]
@new_array.each do |new_array|
csv << new_array
end
file = “#{Rails.root}/public/product_data.csv”
headers = [‘referal_link’, ‘home_link’, ‘count’]
file = CSV.open(file, ‘w’, write_headers: true, headers: headers) do |writer|
@new_array.each do |new_array|
writer << new_array
end
upload_csv.update(generated_csv: file)
end
end
NotificationMailer.send_csv(upload_csv).deliver_now! if @new_array.present?
end
# Метод для получения количества ссылок и сохранения их в массиве
def processed_csv(upload_csv)
@new_array = []
CSV.foreach(upload_csv.csv_file.path, headers: true, header_converters: :symbol) do |row|
row_map = row.to_h
page = HTTParty.get(row_map[:refferal_link])
page_parse = Nokogiri::HTML(page)
link_array = page_parse.css('a').map { |link| link['href'] }
link_array_group = link_array.group_by(&:itself).map { |k, v| [k, v.length] }.to_h
@new_array.push([row_map[:refferal_link], row_map[:home_link], (link_array_group[row_map[:home_link]]).to_s])
end
end
end
Затем мы прикрепим задание после создания upload_csv и добавим проверку на обязательное поле csv_file
пожалуйста, обновите код в app/models/upload_csv.rb
class UploadCsv < ApplicationRecord
mount_uploader :csv_file, AvatarUploader
after_create :processed_csv
def processed_csv
GenrateCsvJob.perform_later(self)
end
end
затем проверьте, после загрузки файла, ваш сгенерированный файл будет обновлен, вы можете проверить сгенерированный csv
внутри /scrape_data/public/product_data.csv
мы можем отправить по электронной почте, используя следующую инструкцию
Сначала мы сгенерируем мейлер
$ rails generate mailer NotificationMailer
обновите код в app/mailers/notification_mailer.rb
def send_csv(upload_csv)
@greeting = 'Привет'
attachments['parsed.csv'] = File.read(upload_csv.generated_csv)
mail(to: "sample@gmail.com", subject: 'CSV успешно обработан.')
end
end
пожалуйста, настройте отправку почты также в config/environments/development.rb or production.rb
добавьте следующие строки в файл
config.action_mailer.default_url_options = { host: 'https://sample-scrape.herokuapp.com/' }
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
user_name: 'sample@gmail.com',
password: '*******123456',
domain: 'gmail.com',
address: 'smtp.gmail.com',
port: '587',
authentication: :plain
}
config.action_mailer.raise_delivery_errors = false
и обновите также представление в app/views/notification_mailer/send_csv.html.erb
<h1>
CSV был обработан, спасибо! </h1>
<p>
<%= @greeting %>
, Пожалуйста, проверьте вложение, чтобы получить письмо
</p>
Спасибо!!