PeaceJet

証券会社で証券外務員(転職しました!)をやりながら、マーケティングやデータ分析・UI/UX改善などを行っています。

Railsで確認画面を表示する方法



Railsで確認画面を表示する方法

Ruby on Railsの申し込みフォームなどで、確認画面を表示させたい場合があると思います。 ネット上ではいくつかの方法が紹介されていますが、情報が分散されてしまっている感があったので整理しようかなと思いました。

GitHubにサンプルを上げていますので、cloneして試してみてください。

github.com

Model

# /app/models/user.rb

class User < ActiveRecord::Base
  include Confirmable
end

Concerns

# /app/models/concerns/confirmable.rb

module Confirmable
  extend ActiveSupport::Concern

  included do
    # validation
    validates :name, presence: true
    validates :email, presence: true
    validates :memo, presence: true

    # new -> confirm
    validates :submitted, acceptance: true
    # confirm -> create
    validates :confirmed, acceptance: true

    after_validation :confirming

    private

    def confirming
      if submitted == ''
        self.submitted = errors.include?(:submitted) && errors.size == 1 ? '1' : ''
      end

      if confirmed == ''
        self.submitted = nil
        self.confirmed = nil
      end

      errors.delete :submitted
      errors.delete :confirmed
    end
  end
end

View

ViewではSlimを使用しました。

# /app/views/users/_form.html.slim

= form_for @user do |f|
  - if @user.errors.any?
    #error_explanation
      h2 = "#{pluralize(@user.errors.count, "error")} prohibited this user from being saved:"
      ul
        - @user.errors.full_messages.each do |message|
          li
            = message
  = f.hidden_field :submitted
  - if @user.submitted == "1"
    .field
      = f.label :name
      = @user.name
      = f.hidden_field :name
      br/
      br/
    .field
      = f.label :email
      = @user.email
      = f.hidden_field :email
      br/
      br/
    .field
      = f.label :memo
      = @user.memo
      = f.hidden_field :memo
      br/
      br/
    .actions
      = f.button "戻る", name: "#{f.object_name}[confirmed]", value: ""
      = f.button "登録する", name: "#{f.object_name}[confirmed]", value: "1"
  - else
    .field
      = f.label :name
      br
      = f.text_field :name
    .field
      = f.label :email
      br
      = f.text_field :email
    .field
      = f.label :memo
      br
      = f.text_field :memo
    .actions
      = f.submit '入力内容を確認する', data: { disable_with: "Please Wait..." }