Create an inquiry form like this.
This time it is a method to send to gmail in the development environment.

ruby 2.5.7 Rails 5.2.4.3 OS: macOS Catalina
bootstrap4 installed
[Ruby on Rails] How to write enum in Japanese Used to select the subject of your inquiry. This is where _i18n is used.
1 Create and edit mailer 2 Creating a table 3 Edit config / environments / development.rb 4 Setting environment variables 5 Creating a controller 6 routing edit 7 Edit view 8 Allow access to insecure apps with your google account
Terminal
$ rails g mailer ContactMailer
Specify the destination and subject. ENV ['TOMAIL'] will be set later.
app/mailers/thanks_mailer.rb
class ContactMailer < ApplicationMailer
  def send_mail(contact)
    @contact = contact
    mail to:   ENV['TOMAIL'], subject: '【Contact Us】' + @contact.subject_i18n
  end
end
Terminal
$ rails g model Contact
Add the columns you need. I will explain the enum settings in the next article.
db/migrate/xxxxxxxxxxxxx_create_contacts.rb
class CreateContacts < ActiveRecord::Migration[5.2]
  def change
    create_table :contacts do |t|
      t.string :name, null: false
      t.string :email, null: false
      t.string :phone_number, null: false
      t.integer :subject, default: 0, null: false
      t.text :message, null: false
      t.timestamps
    end
  end
end
config/enviroments/development.rb
...
config.action_mailer.raise_delivery_errors = false 
↓ Change to true
config.action_mailer.raise_delivery_errors = true
...
config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
      port: 587,
      address: 'smtp.gmail.com',
      domain: 'smtp.gmail.com',
      user_name: ENV['SMTP_USERNAME'],
      password: ENV['SMTP_PASSWORD'],
      enable_starttls_auto: true
  }
end
Don't upload your address and password on GitHub this time Use gem "dotenv-rails".
Gemfile
gem "dotenv-rails"
Terminal
$ bundle install
Then create an .env file in the same hierarchy as the Gemfile
.env
TOMAIL=Destination address
SMTP_USERNAME=Sender's gmail address
SMTP_PASSWORD=Sender's gmail address password
 Add the following to the bottom of the .gitignore file.
.gitignore
/.env
Terminal
$ rails g controller contacts
app/controllers/contacts_controller.rb
class Public::ContactsController < ApplicationController
  def new
    @contact = Contact.new
  end
  
  #If you want to create a confirmation screen, you should write something like this.
  #Receive input from new action
  #When the submit button is pressed, the create action is executed.
  def confirm
    @contact = Contact.new(contact_params)
    if @contact.invalid?
      render :new
    end
  end
 
  #If there is an error in the input contents,
  #I think it is natural to return to the previous page while retaining the input contents,
  #This is possible by defining a back action.
  def back
    @contact = Contact.new(contact_params)
    render :new
  end
  #It is the action that is actually sent.
  #This is the first time you save your input.
  #For security reasons, you may want to delete the input contents after a certain period of time.
  def create
    @contact = Contact.new(contact_params)
    if @contact.save
      ContactMailer.send_mail(@contact).deliver_now
      redirect_to done_path
    else
      render :new
    end
  end
  #Please use when using the transmission completion screen.
  def done
  end
  private
  def contact_params
    params.require(:contact)
          .permit(:email,
                  :name,
                  :phone_number,
                  :subject,
                  :message
                 )
  end
end
config/routes
resources :contacts, only: [:new, :create]
post 'contacts/confirm', to: 'contacts#confirm', as: 'confirm'
post 'contacts/back', to: 'contacts#back', as: 'back'
get 'done', to: 'contacts#done', as: 'done'
Under app / views / contact_mailer send_mail.html.erb Please create send_text.html.erb.
erb:app/views/contact_mailer/send_mail.html.erb,send_text.html.erb
<%= @contact.name %>I received an inquiry from Mr.<br>
【Tel】:<%= @contact.phone_number %><br>
【Mail】:<%= @contact.email %><br>
[Requirements]:<%= @contact.subject_i18n %><br>
【Content of inquiry】<br>
<span style="white-space: pre-wrap;"><%= @contact.message %></span>
We will create the actual input form.
erb:app/views/contacts/new.html.erb
<%= form_for(@contact, url: confirm_path) do |f| %>
  <div class="form-group">
    <%= f.label :name, 'name*' %>
    <%= f.text_field :name, autofocus: true, class: 'form-control' %>
  </div>
    
  <div class="form-group">
    <%= f.label :message, 'message*' %>
    <%= f.text_area :message, size: '10x10', class: 'form-control' %>
  </div>
  <div>
    <%= f.submit 'Confirm input' %>
  </div>
<% end %>
Write the code to return to the input screen from the confirmation screen.
erb:app/views/contacts/confirm.html.erb
<table>
  <tbody>
    <tr>
      <td class="text-center" style="width: 30%;">name</td>
      <td><%= @contact.name %></td>
    </tr>
    <tr>
      <td class="text-center">message</td>
      <td style="white-space: pre-wrap;"><%= @contact.message %></td>
    </tr>
  </tbody>
</table>
<%= form_for(@contact) do |f| %>
  <%= f.hidden_field :name %>
  <%= f.hidden_field :email %>
  <%= f.hidden_field :phone_number %>
  <%= f.hidden_field :subject %>
  <%= f.hidden_field :message %>
  <div><%= f.submit 'Send' %></div>
<% end %>
<%= form_for @contact, url: back_path do |f| %>
  <%= f.hidden_field :name %>
  <%= f.hidden_field :email %>
  <%= f.hidden_field :phone_number %>
  <%= f.hidden_field :subject %>
  <%= f.hidden_field :message %>
  <div><%= f.submit 'Returns to the input screen' %></div>
<% end %>
 How to enable access to Google insecure apps This article was easy to understand, so please refer to it.
-Rails and email sending this and that -How to use environment variables in Ruby On Rails * English -Simple implementation of inquiry function -How to create an inquiry form with rails and send it to your email address
Because it deals with personal addresses and phone numbers I think it is essential to delete the privacy policy and information on a regular basis. However, I think that being able to automatically send emails to the other party is a high priority in various cases. You may want to understand it well.
Also, on twitter, technologies and ideas that are not uploaded to Qiita are also uploaded, so I would be grateful if you could follow me. Click here for details https://twitter.com/japwork
Recommended Posts