&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ってやつがいいかも?