LoginSignup
1
1

More than 5 years have passed since last update.

RailsでFormObjectをつかったお問い合わせメール

Posted at

はじめに

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の強みなんだと思う。

おわり。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1