&tag(Rails3/問い合わせフォーム);
*目次 [#lc4e6501]
#contents
*関連ページ [#d84b8373]
-[[Rails3]]
-[[SimpleCaptcha]]
*参考情報 [#xd7e1c22]
-[[Rails3で問い合わせフォームを作る - Prototype[beta]:http://prototype-beta.com/prototype/entry/9_rails3%E3%81%A7%E5%95%8F%E3%81%84%E5%90%88%E3%82%8F%E3%81%9B%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%82%92%E4%BD%9C%E3%82%8B]] … DBに保存して送信するタイプ。
-[[Contact form in Rails 3 / Mat Harvard:http://matharvard.ca/posts/2011/aug/22/contact-form-in-rails-3/]] … 保存せず送信するタイプ(英語)
-[[Railsの問い合わせフォームからSESでメールを送信する - okochangのインフラ日誌:http://okochang.hatenablog.jp/entry/2013/06/27/100115]]…上の日本語版的なもの
-[[Rails3.0から3.1への移行とRSS(Atom)フィードの取得 - give IT a try:http://blog.jnito.com/entry/20120323/1332456687]] … 保存せず送信するタイプ
-[[Rails3 ActiveRecordではないモデル | ツボニチ:http://tsubo3.wordpress.com/2011/12/26/rails3-activerecord%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84%E3%83%A2%E3%83%87%E3%83%AB/]] … DBに保存しないモデルの例
*基本 [#l1a0ade5]
**概要 [#k38dafcc]
-DBに問い合わせ内容を保存しつつメールを送信するか、ただ単にメールを送信するかにわかれる。
-DB作るのがめんどくさい場合メール送信するだけでいいかも。
-DBに保存してないタイプのモデルを作成し画面からの情報をうけとり、検証し、ActionMailerで使って送信するのが基本的な流れとなる。

** モデルの生成 [#l21e6dca]
-app/models/contact.rbを生成
#pre{{
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の設定[#q09f20b6]
***smtpサーバーの設定 [#adee9283]
-[[../メール送信]]を参考にして、development.rb / production.rb などで、smtpサーバーの設定を行っておく。
*** Mailerの設定[#kc6ce864]
-モデル
#pre{{
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
#pre{{
Name: <%= @contact.name %>
Email: <%= @contact.email %>
Subject: <%= @contact.subject %>

Message:
<%= @contact.message %>

}}

**お問い合わせフォームのビュー [#g75b335d]
#pre{{
    <%= 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 %>
}}
**お問い合わせフォームのコントローラー [#sa2a5ab5]
-app/controllers/contacts_controller.rbを作成。
-通常の保存時の処理のように、newで表示し、createで実行するスタイル。
-メッセージ送信後エラーの場合は再表示、成功の場合rootに戻っている
-この辺は工夫の余地あり。「送信に成功しました」といったメッセージを表示したほうがよいかも。
#pre{{
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
}}
**ルーティングの設定 [#bfd290a1]
-routes.rbを編集する
#pre{{
 match 'contact' => 'contact#new', :as => 'contact', :via => :get
 match 'contact' => 'contact#create', :as => 'contact', :via => :post
 match 'contact' => 'contacts#new', :as => 'contacts', :via => :get
 match 'contact' => 'contacts#create', :as => 'contacts', :via => :post
}}
*Tips [#w54dd97b]
**メールアドレスを併記する [#e46b3a4e]
-[[スパムロボット対策をして、安全にWebサイトにメールアドレスを記載する | PLUS:http://plus.vc/web/javascript/5842/]]にある、Email Riddlerってやつがいいかも?

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS