Ruby on Railsでメッセージ送信機能を実装します。入力ページ => 確認ページ => 完了ページ の流れです。確認ページにて、再編集なら戻り、確定なら送信します。その時にサイト管理者へメールでメッセージを送ります。データベースは使わないやり方です。
みなみに本記事の続編では、作成したフォームをsimple_form、bootstrap、i18nで作り込んでいますhttps://remonote.jp/rails-simple_form-bootstrap
バージョンは次の通りです。
1 2 3 4 |
$ ruby -v ruby 2.4.0 $ rails -v Rails 5.1.6 |
本記事ではMessagesコントローラーを作成していますが、ここは適宜、変更してください。
1 |
$ rails g controller messages |
Routes
config/routes.rb
1 2 3 4 5 |
Rails.application.routes.draw do get 'index' =>'messages#index' post 'confirm' => 'messages#confirm' post 'done' => 'messages#done' end |
Controller
ポイントは確認画面から戻るためのparams[:back]です。
app/controllers/messages_controller.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
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 |
Views
入力ページ/確認ページ/完了ページのファイルを作ります。最小限の記述ですが、ご了承ください。
app/views/messages/index.html.erb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<%= 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 %> |
hiddenで値を保持して戻れるようにします。
app/views/messages/confirm.html.erb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<%= 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 '戻る', name: 'back' %> <%= f.submit '送信する' %> </div> <% end %> |
app/views/messages/done.html.erb
1 2 3 4 5 6 |
<div> <h2>メッセージ送信完了</h2> <p> メッセージをいただきありがとうございました。 </p> </div> |
Models
今回はデータベースを使いませんのでモデルはActiveModelを使います。
これでデータの格納やバリデーションもOK!メールの正規表現も入れています。
app/models/message.rb
1 2 3 4 5 6 7 8 9 10 |
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 |
Mailer
メッセージ送信用のクラスとビューを作成します。
app/controllers/mailers/message_mailer.rb
1 2 3 4 5 6 7 8 9 10 11 |
class MessageMailer < ApplicationMailer default to: 'example@gmail.com' # 送信先アドレス def received_email(message) @message = message mail(subject: 'webサイトよりメッセージが届きました') do |format| format.text end end end |
app/views/message_mailer/received_email.text.erb
1 2 3 4 |
<%= @message.name %>様からメッセージが届きました。 メールアドレス:<%= @message.email %> 内容:<%= @message.content %> |
Environments
最後にメールサーバの設定ですが、本記事では開発環境にGmailでの設定方法について行います。
config/environments/development.rb
1 2 3 4 5 6 7 8 9 10 |
config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { :address => "smtp.gmail.com", :port => 587, :domain => "gmail.com", :user_name => 'example@gmail.com', :password => "****************", #2段階認証パスワード :authentication => :plain, :enable_starttls_auto => true } |
以上です!
続編として、今回作成したフォームをsimple_form、bootstrap、i18nで作り込みますhttps://remonote.jp/rails-simple_form-bootstrap