2012年10月24日水曜日

画像認証(simple_capcha)を使ってメール送信

今回は問い合わせフォームを作成する際に画像認証が必要だったので勉強しました。
またメールを送る際にデータベースと関わりがない「Active model」を使用してみました。

まずはGemを使います。(Gemfile)
gem "galetahub-simple_captcha", :require => "simple_captcha"
Gemの情報はこちらhttps://github.com/galetahub/simple-captcha
次にsimple_captchaのdbを作成します。
$ rails g simple_captcha
$ rake db:migrate
インストールした後サーバーを再起動しこっからじゃんじゃん作ります。
ルーティング〜(config/routes.rb)
resource :message, only: [ :new, :create ] do
  get :thanks
end
次はモデル〜(models/message.rb)
class Message
  include ActiveModel::Validations
  include ActiveModel::Conversion
  extend ActiveModel::Naming
  extend SimpleCaptcha::ModelHelpers::SingletonMethods

  apply_simple_captcha
  attr_accessor :body, :name, :email, :subject

  validates :body, :subject, :name, presence: true
  validates :email, format: { with: /^[0-9a-zA-Z_\.\-]+?@[0-9A-Za-z_\.\-]+\.[0-9A-Za-z_\.\-]+$/, allow_blank: true }, presence: true

  def initialize(attributes = {})
    attributes.each do |name, value|
      send("#{name}=", value)
    end
  end
 
  def persisted?
    false
  end
end
「extend SimpleCaptcha::ModelHelpers::SingletonMethods」と「apply_simple_captcha」が重要です!
Active Modelの場合はいろいろと書く必要があります。
  • include ActiveModel::Validation
  • include ActiveModel::Conversion
  • extend ActiveModel::Naming
この3つはデフォルトで付けてもいいかもしれません。
あとはメールのバリデーションを行い、下に記述した
  • initialize
  • persisted?
もデフォルトで良いかと思います。

次はコントローラーを作成します。(controllers/messages_controller.rb)
class MessagesController < ApplicationController
  def new
  end
 
  def create
    @message = Message.new(params[:message])
    if @message.valid_with_captcha?
      MessageMailer.standard(@message).deliver
      redirect_to action: :thanks
    else
      flash.now.alert = "記入内容に不備があります。"
      render :new
    end
  end
 
  def thanks
  end
end
アプリケーションコントローラーにも追加(controllers/application_controller.rb)
include SimpleCaptcha::ControllerHelpers
ここはメール送るコントローラーとあまり変わりませんが、
「valid_with_captcha?」で画像認証の判断をしています。
やっとviewです。newを作成します。(messages/new.html.slim)
div class="message_views"
  h2 お問い合わせ
  div class="messages"
    div class="form"
      = form_for @message, url: message_path do |f|
        div class="form_column
          = f.label :name, "名前"
          = f.text_field :name
        div class="form_column
          = f.label :email, "メールアドレス"
          = f.text_field :email
        div class="form_column
          = f.label :subject, "件名"
          = f.text_field :subject
        div class="form_column"
          = f.label :body, "本文"
          = f.text_area :body
        div class="form_column_captcha"
          = f.simple_captcha label: "Enter ..."
        div class="submit"
          = f.submit "送信"
ここで重要なのは「f.simple_captcha label: "Enter ..."」ですね。Enterの所に好きな文言を入れればそれっぽくなります。
次はメールの文章内容です。(message_mailer/standard.text.erb)
○ wataruからのメッセージ受信のお知らせ
--------------------------------------------------------
<%= @message.name %>さんからメッセージが届いています。
送信元:<%= @message.email %>
--メッセージ--

<%= (@admin_message.body) %>

+………………………………………………………………………+
  メモってくれちゃってホントね!
+………………………………………………………………………+
最後はメーラーを作って終わりです。(mailers/message_mailer.rb)
class MessageMailer < ActionMailer::Base
  default charset: 'ISO-2022-JP', from: "info@example.com"

  def standard(message)
    @message = message
    mail(to: "wataru@example.jp", subject: message.subject)
  end
end

0 件のコメント:

コメントを投稿