Я относительно новичок в Rails.Я создал простое приложение с использованием Ruby 2.5 и Rails 5.2, которое будет отправлять электронное письмо администратору, когда посетитель веб-сайта запрашивает некоторую информацию.Приложение не использует базу данных, потому что никакая информация посетителя не должна быть сохранена или сохранена, поэтому ActiveRecord не используется.Просто нужно получить некоторую информацию от посетителя через форму и отправить ее по электронной почте.Исследования предлагают использовать ActiveModel вместо этого, но я до сих пор не могу заставить его работать.Не нужно никаких сторонних почтовых приложений.Что я пропускаю?Модель, Контроллер, Виды, Код почтового сообщения приведены ниже.
#Model: Visitor.rb
class Visitor
include ActiveModel::Model
include ActiveModel::Conversion
extend ActiveModel::Naming
include ActiveModel::Validations
attr_accessor :fname, :lname, :phone, :email, :interest
# Validations & Requirements
validates :fname, presence: true, length: { maximum: 50 }
validates :lname, presence: true, length: { maximum: 50 }
validates :lname, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
validates :email, presence: true, length: { maximum: 255 }, format: { with: VALID_EMAIL_REGEX }
validates :interest, presence: true
def initialize(fname, lname, phone, email, interest)
@fname = fname
@lname = lname
@phone = phone
@email = email
@interest = interest
post_initialize
end
# #make in lieu of #create
def self.make(fname, lname, phone, email, interest)
attributes = {fname: fname, lname: lname, phone: phone, email: email, interest: interest}
object = new(attributes)
object.save
@visitor = object
@visitor
end
def persisted?
false
end
def send_mail
# Following method defined in NotifierMailer
NotifierMailer.visitor_info(self).deliver_now
end
private
def post_initialize
if email
email.downcase
end
end
end
# Controller: Visitors_controller.rb
class VisitorsController < ApplicationController
def new
@Visitor = Visitor.new
end
def make
@visitor = Visitor.new(visitor_params)
if @visitor.valid?
@visitor.send_mail # Instance method in Guest model
flash[:notice] = "Your request has been sent! Thank you for contacting us."
redirect_to welcome_path
else
render 'new'
end
end
private
def visitor_params
params.require(:visitor).permit(:fname, :lname, :phone, :email, :interest)
end
end
# Routes: Routes.rb
Rails.application.routes.draw do
get 'favicon', to: 'pages#favicon'
root to: 'pages#index', as: 'welcome'
# ... other routes for static page navigation
get '/reqinfo', to: 'visitors#new'
post '/reqinfo', to: 'visitors#make'
end
# View: New.html.erb
<div class="row">
<div class="col-md-6 col-md-offset-3">
<%= form_with model: @visitor, url: reqinfo_path, local: true do |form| %>
<%= render 'layouts/error_messages', object: form.object %>
<%= form.label 'First Name' %>
<%= form.text_field :fname, class: 'form-control' %>
<%= form.label 'Last Name' %>
<%= form.text_field :lname, class: 'form-control' %>
<%= form.label :phone %>
<%= form.text_field :phone, class: 'form-control' %>
<%= form.label 'Email Address' %>
<%= form.text_field :email, class: 'form-control' %>
<%= form.label 'Interest' %>
<%= form.text_field :interest, class 'form-control' %>
<%= form.submit 'Submit', id: "button" %>
<% end %><!-- form_with -->
</div><!-- col-md6-3 -->
</div><!-- row -->
# Mailer: Notifier_mailer.rb
class NotifierMailer < ApplicationMailer
default from: 'noreply@thecompany.com'
def guest_info(visitor)
@visitor = visitor
mail(to: 'admin@thecompany.com', subject: "Website Visitors Request for Information")
end
end
# Message: Visitor_info.html.erb
<h1>Dear Admin;</h1>
<br>
<% timestamp = Time.now %>
<p>
<%= visitor.fname %> <%= @visitor.lname %> visited the TheCompany website on <%= timestamp.localtime %>. He/she is requesting information regarding a <%= @visitor.interest %>. Their contact information phone: <%= @visitor.phone %> and email: <%= @visitor.email %>
</p>