はじめに
FormObjectなるものがあるらしく使ってみたくなったのでFormObjectをつかってお問い合わせメール機能を作成してみた。
FormObjectとは
activemodelの機能を使って実際にモデルとして存在するもの以外にもバリデーションをつかうことらしい
作っていく
rails new contact_form
rails g controller contacts new
rails g mailer inquiry
として
routes.rbに
resource :contact
を追加
app以下にformsフォルダを作成してそこにcontact_form.rbを作成
中身を
class ContactForm
include ActiveModel::Model
attr_accessor :email,:title,:body
validates :email, presence: true
validates :title, presence: true
validates :body, presence: true
def save
return false if invalid?
InquiryMailer.send_mail(email,title,body).deliver_now
end
end
こうする。
activemodelをincludeしていることでvalidatesが使えたりする
saveはContactForm.saveの時に実行されて、もじemail,title,bodyがなかったらreturn falseされる感じになってる。
ContactForm.new(......)
みたいにするのでattr_accessorで使う値を指定してあげないといけない
次にmailerを作っていく
class InquiryMailer < ApplicationMailer
def send_mail(email,title,body)
@email = email
@title = title
@body = body
mail(subject: 'お問い合わせ', to: 'mysite@gmail.com', from: email)
end
end
あとはviews/inquiry_mailerの中にsend_mail.html.erb,send_mail.txt.erbを作成してあげればOK
controllerはこんな感じ
class ContactsController < ApplicationController
def new
@contact = ContactForm.new(email: params[:email],title: params[:title],body: params[:body])
end
def create
@contact = ContactForm.new(email: params[:email],title: params[:title],body: params[:body])
if @contact.save
else
render :new
end
end
private
def contact_params
end
end
なぜかストロングパラメータ使おうとしたらエラーでてめんどくさいからそのまま値をいれた。
最後にview
<% if @contact.errors.any? %>
<% @contact.errors.full_messages.each do |msg| %>
<%= msg %>
<% end %>
<% end %>
<%= form_with url: contact_path, local: true do |f| %>
<%= f.label :email %>
<%= f.text_field :email %>
<%= f.label :title %>
<%= f.text_field :title %>
<%= f.label :body %>
<%= f.text_field :body %>
<%= f.submit %>
<% end %>
activemodelの機能が使えるのでエラーも表示できる。
これがform_objectの強みなんだと思う。
おわり。