Tag: Rails3/問い合わせフォーム

目次

関連ページ

参考情報

基本

概要

  • DBに問い合わせ内容を保存しつつメールを送信するか、ただ単にメールを送信するかにわかれる。
  • DB作るのがめんどくさい場合メール送信するだけでいいかも。
  • DBに保存してないタイプのモデルを作成し画面からの情報をうけとり、検証し、ActionMailerで使って送信するのが基本的な流れとなる。

モデルの生成

  • app/models/contact.rbを生成
    class Contact
      include ActiveModel::Validations
      include ActiveModel::Conversion
      extend ActiveModel::Naming
    
      attr_accessor :name, :email, :subject, :message
    
      validates :name, :presence => true
      # confirmation?が必要
      validates :email, :presence => true, :format => { :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i }
      validates :subject, :presence => true
      validates :message, :presence => true
    
      def initialize(attributes = {})
        attributes.each do |name, value|
          send("#{name}=", value)
        end
      end
      
      def persisted?
        false
      end
    end
    

ActionMailerの設定

smtpサーバーの設定

  • ../メール送信を参考にして、development.rb / production.rb などで、smtpサーバーの設定を行っておく。

Mailerの設定

  • モデル
    class Message < ActionMailer::Base
      include ApplicationHelper
      default from: "noreply@example.com"
    
      def new_contact(contact)
        @contact = contact
        mail(:to => "tom@example.com", :subject => "[Contact Us] #{contact.subject}")
      end
    end
    
  • ビュー。app/views/message/new_contact.text.erb
    Name: <%= @contact.name %>
    Email: <%= @contact.email %>
    Subject: <%= @contact.subject %>
    
    Message:
    <%= @contact.message %>
    
    

お問い合わせフォームのビュー

    <%= form_for(@contact, :url => about_create_path, :html => {:class =>'form-inline'}) do |f| %>
        <% if @contact.errors.any? %>
            <div id="error_explanation">
                <h2>エラーが発生しました :</h2>
                <ul>
                    <% @contact.errors.full_messages.each do |msg| %>
                        <li><%= msg %></li>
                    <% end %>
                </ul>
            </div>
        <% end %>
        <table class="table table-bordered table-condensed">
            <tr>
                <th class="span2">お名前</th>
                <td><%= f.text_field :name, {:class => 'span6'} %></td>
            </tr>
            <tr>
                <th class="span2">メール</th>
                <td><%= f.text_field :email, {:class => 'span6'} %></td>
            </tr>
            <tr>
                <th class="span2">題名</th>
                <td><%= f.text_field :subject, {:class => 'span6'} %></td>
            </tr>
            <tr>
                <th class="span2">内容</th>
                <td>
                    <%= f.text_area :message, {:rows => 6, :class => 'span6'} %>
                </td>
            </tr>
        </table>
        <p>
        <span style="width:200px;">
            <%= f.submit '送信',  :name => 'save_button', :class=>'btn btn-primary' %>
        </span>
        </p>
    <% end %>

お問い合わせフォームのコントローラー

  • app/controllers/contacts_controller.rbを作成。
  • 通常の保存時の処理のように、newで表示し、createで実行するスタイル。
  • メッセージ送信後エラーの場合は再表示、成功の場合rootに戻っている
  • この辺は工夫の余地あり。「送信に成功しました」といったメッセージを表示したほうがよいかも。
    class ContactsController < ApplicationController
      def new
        @contact = Contact.new
      end
    
      def create
        @contact = Contact.new(params[:contact])
        if @contact.valid?
          Message.new_contact(@contact).deliver
          redirect_to(root_path, :notice => "Message was successfully sent.")
        else
          flash.now.alert = "Please fill all fields."
          render :new
        end
      end
    end
    

ルーティングの設定

  • routes.rbを編集する
     match 'contact' => 'contacts#new', :as => 'contacts', :via => :get
     match 'contact' => 'contacts#create', :as => 'contacts', :via => :post
    

Tips

メールアドレスを併記する


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-04-13 (水) 16:47:36