今日は最後の仕上げのメール送信。フォームで問い合わせた内容を固定のメールアドレスを送信する処理を追加してみる。
まずは、generatorでmailerのmodelを作成する。
[code]
ruby script/generate mailer ContactMailer result
[/code]
これにより、
app/views/contact_mailer/result.rhtml
app/models/contact_mailer.rb
というファイルが作成される。まずは、modelのほうを編集してみる。
vi app/models/contact_mailer.rb
[ruby]
class ContactMailer < Iso2022jpMailer
def result(contact)
@subject = 'お問い合わせ'
@body["contact"] = contact
@from = 'test@test.com'
@recipients = 'test@test.com'
@sent_on = Time.now
@headers = {}
end
end
[/ruby]
ぱっと中身をみただけで、だいたい何をしたらよいかわかると思うが、まずはActiveHeartの日本語化の機能を利用するため、ActionMailer::Baseを継承している部分を、Iso2022jpMailerを継承させるように変更する。
あとはプロパティで送信者(from)、あて先(recipients)やsubjectなどを定義してしまう。メールの内容をフォームの値をそのまま使うように
@body[“contact”] = contact
で引数でわたってくる、contactオブジェクトをbodyに渡している。
そしてviewのほうはこんな感じです。
vi app/views/contact_mailer/result.rhtml
[code]
お問い合わせがありました
No.:<%= @contact.id %>
お名前:<%= @contact.personal %>
E-Mail:<%= @contact.email %>
お問い合わせ内容:<%= @contact.message %>
[/code]
そして、このmailerを利用するように、Controllerに呼び出しを書く。
今回は、最後なのでcontrollerのコードをすべて載せておきます。
vi app/controllers/contact_controller.rb
[ruby]
class ContactController < ApplicationController
model :contact
service :contact_mailer
def form
@contact = Contact.new()
end
def confirm
@contact = Contact.new(@params[:contact])
unless @contact.valid?
render :action => “form”
end
end
def end
@contact = Contact.new(@params[:contact])
@contact.entry = Time.now
if @contact.save
email = ContactMailer.create_result(@contact)
email.set_content_type(“text/plain”)
ContactMailer.deliver(email)
else
render :action => “form”
end
end
end
[/ruby]
先頭にcontact_mailerを利用することを宣言し
service :contact_mailer
endメソッドにmailerのオブジェクトを作成し、deliveryメソッドを呼ぶだけで終了だ。
というわけで、はじめてのRailsを体験してみての感想を書いてみる。
良いところ
1.コードを書く量がほんとうに少ない。
2.規約さえ覚えてしまえば、さくさくとコードが書ける。
3.規約のおかげで、どこにどういうコードを書くのかが明確。
4.ソースコードをぱっとみただけで、何をやっているかわかりやすい。
5.ネット上での情報もそこそこ多い。
いまいちなところ
1.viewでformタグを書き換えてしまうと、htmlとしてデザインを確認しにくい。
2.さくらインターネットでcgiとして動かすと明らかに動作が遅い。(Railsの感想ではないが)
3.実際にどういう動作をしているのか、見えにくい。(まあフレームワークなので)
と良いところの目立つ、さすがに今利用が爆発的に増えているフレームワークであることを納得できました。
Check Tweet