7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

お問い合わせフォーム作成

Last updated at Posted at 2020-04-15

今回はこの様なお問い合わせフォームの作成を致します。
投稿された内容がG-Mailに届く様になっています。

Image from Gyazo

こちらのサイトを参考にさせていただきました。
https://remonote.jp/rails-confirm-form
https://qiita.com/annaaida/items/81d8a3f1b7ae3b52dc2b

2020/4/18
環境変数の設定をdotenvからcredentials.yml.encに変更しました。

STEP1

まずルーティング、コントローラーを作成

config/routes.rb


 Rails.application.routes.draw do 
 get  'index' =>'messages#index' 
 post 'confirm' => 'messages#confirm'
 post 'done' => 'messages#done' 
 end 

ターミナル

$ rails g controller messages

STEP2

コントローラーを記述していきます。
バリデーションに引っかかったときや、戻るボタンを押した時などの記載もありますね。

app/controllers/messages_controller.rb


class MessagesController < ApplicationController
  def index
    @message = Message.new
  end
 
  def confirm
    @message = Message.new(message_params)
    if @message.valid?
      render :action => 'confirm'
    else
      render :action => 'index'
    end
  end
 
  def done
    @message = Message.new(message_params)
    if params[:back]
      render :action => 'index'
    else
      MessageMailer.received_email(@message).deliver_now
      render :action => 'done'
    end
  end
  
  private
  def message_params
    params.require(:message).permit(:name, :email, :content)
  end
end

STEP3

ビューを作成してきます。

投稿画面

app/views/messages/index.html.erb



<%= form_for(@message, url: { action: :confirm }) do |f| %>
  <div>
    <h2>お問い合わせ</h2>
 
      <% if @message.errors.present? %>
        <div>
          <strong>入力内容にエラーがあります</strong>
          <ul>
            <% @message.errors.each do |attr, error| %>
              <li><%= error %></li>
            <% end %>
          </ul>
        </div>
      <% end %>
    
    <div>
      <strong>名前</strong>
      <p><%= f.text_field :name, placeholder: '20文字以内' %></p>
    </div>
    <div>
      <strong>メールアドレス</strong>
      <p><%= f.text_field :email, placeholder: '30文字以内' %></p>
    </div>
    <div>
      <strong>内容</strong>
      <p><%= f.text_area :content, placeholder: '200文字以内' %></p>
    </div>
      <%= f.submit '確認画面へ' %>
  </div>
<% end %>

内容確認画面
app/views/messages/confirm.html.erb



<%= form_for @message, :url => done_path do |f| %>
  <div>
    <h2>内容確認</h2>
    <div>
      <strong>名前</strong>
      <p>
        <%= f.hidden_field :name %>
        <%= @message.name %>
      </p>
    </div>
    <div>
      <strong>メールアドレス</strong>
      <p>
        <%= f.hidden_field :email %>
        <%= @message.email %>
      </p>
    </div>
    <div>
      <strong>内容</strong>
      <p>
        <%= f.hidden_field :content %>
        <%= simple_format(@message.content) %>
      </p>
    </div>
      <%= f.submit '送信する' %>
      <%= f.submit '戻る', name: 'back' %>
  </div>
<% end %>

投稿完了画面
app/views/messages/done.html.erb

<div>
  <h2>メッセージ送信完了</h2>
  <p>
    メッセージをいただきありがとうございました。
  </p>
</div>

STEP4

モデルの作成
今回はデータベースを使わず、モデルはActiveModelを使っています。

app/models/message.rb


class Message include ActiveModel::Model
 
  attr_accessor :name, :email, :content
 
  validates :name, presence: true, length: { maximum: 20 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 30 },
                    format: { with: VALID_EMAIL_REGEX }
  validates :content, presence: true, length: { maximum: 200 }
end

STEP5

環境変数にメールアドレスと2段階認証パスワードをセットします。

2段階認証パスワード発行がまだの方は下記の記事をご確認ください。
参考
https://www.howtonote.jp/google-account/2step-verify/index6.html

環境変数はcredentials.yml.encで設定しました。
こちらの記事に方法を記載しております。
https://qiita.com/shimpex/items/9e75863efc1808aad23d

STEP6

メイラーを作成します。

ターミナル

$ rails generate mailer MessageMailer

app/mailers/message_mailer.rb


class MessageMailer < ApplicationMailer
  default to: Rails.application.credentials.g_mail[:g_mail] # 送信先アドレス
 
  def received_email(message)
    @message = message
    mail(subject: 'webサイトよりメッセージが届きました') do |format|
      format.text
    end
  end
 
end

届くメールの内容を記述します。

app/views/message_mailer/received_email.text.erb


<%= @message.name %>様からメッセージが届きました。
 
メールアドレス:<%= @message.email %>
内容:<%= @message.content %>

STEP7

メールサーバー設定

config/environments/development.rb


  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
      :address => "smtp.gmail.com",
      :port => 587,
      :domain => "gmail.com",
      :user_name => Rails.application.credentials.g_mail[:g_mail], # 送信先アドレス
      :password => Rails.application.credentials.g_mail[:g_pass], #2段階認証パスワード
      :authentication => :plain,
      :enable_starttls_auto => true
  }

適用させるためrails sをし直してください。
以上でお問い合わせフォームが完成です。
あとは、必要に応じてCSSでビューを整えてください。

最後に

環境変数の設定もお問い合わせフォームの作成も色々な方法があるので、どれが優れているのかを判断することは難しいですが、とりあえず上記の方法でお問い合わせフォームからの投稿とメールの受信ができました。
ありがとうございました。

7
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?