Upgrade to Pro — share decks privately, control downloads, hide ads and more …

「確認画面」ベストプラクティス

 「確認画面」ベストプラクティス

RailsでWebアプリケーションを作るとほぼ必ず要件として現れる「入力確認画面」。しかしRailsのテンプレートとしては用意されていないので、プロジェクトごとに意見が分かれる部分の1つではないでしょうか。この発表では実際のプロジェクトで起きた事例を通じて、入力確認画面の実装を比較・紹介し、ベストプラクティスのノウハウを共有します。

strviola

July 17, 2019
Tweet

More Decks by strviola

Other Decks in Programming

Transcript

  1. 2

  2. 4

  3. ཁ݅ ϑΥʔϜೖྗ஋͕ valid ͳΒ֬ೝը໘ʹભҠ ϑΥʔϜೖྗ஋Λදࣔ "֬ఆ" ΛΫϦοΫͯ͠ POST "मਖ਼" ΛΫϦοΫͯ͠ϑΥʔϜʹ໭Δ

    "मਖ਼" Ͱ໭ͬͨࡍʹೖྗ஋Λอଘ ϑΥʔϜೖྗ஋͕ valid Ͱͳ͚Ε͹ϑΥʔϜΛ࠶දࣔ 13
  4. গ͠લͷฐࣾ module ConfirmModule extend ActiveSupport::Concern included do validates :confirmed, acceptance:

    true after_validation :check_confirming end def check_confirming errors.delete(:confirmed) self.confirmed = errors.empty? ? '1' : '' end def clear_confirmed self.confirmed = '' end end 15 ͨͩ͠νΣοΫϘοΫεແ͠
  5. গ͠લͷฐࣾ class MessagesController < ApplicationController def create @message = Message.new(message_params)

    if params[:fix] @message.clear_confirmed render :new elsif @message.save redirect_to @message else render :new end end end 17 ʮमਖ਼ʯΫϦοΫͨ͠ ϑΥʔϜ͕ଥ౰ ೖྗϛε or ֬ೝ "or" ?
  6. গ͠લͷฐࣾ / new.html.slim - if @message.confirmed.blank? h1 New Message =

    render 'form', message: @message - else h1 Confirm Message = render 'confirm', message: @message = link_to 'Back', messages_path 18 ࠷ॳ or Τϥʔ ! blank ֬ೝը໘ ! present ϑΥʔϜදࣔ ֬ೝը໘
  7. গ͠લͷฐࣾ / _form.html.slim = form_for message do |form| - if

    message.errors.any? / display errors = form.hidden_field :confirmed = form.text_area :body = form.submit '֬ೝ' 19 '' (blank)
  8. গ͠લͷฐࣾ / _confirm.html.slim = form_for message do |form| = form.hidden_field

    :confirmed = form.hidden_field :body h2 body p = message.body = form.submit 'ૹ৴' = form.submit 'मਖ਼', name: 'fix' 20 ֬ೝ಺༰දࣔ '1' (present) params[:fix].present? == true
  9. গ͠લͷฐࣾ class MessagesController < ApplicationController def create @message = Message.new(message_params)

    if params[:fix] @message.clear_confirmed render :new elsif @message.save redirect_to @message else render :new end end end 21 ֬ೝը໘͔Βˠ message[confirmed] = '1' ඞཁʹԠͯ͡ফ͢
  10. build @model @model.valid? .check_confirming .confirmed params['fix'] render :new .save! redirect

    POST :create true false blank? present? present? blank? .clear_confirmed 22
  11. 23

  12. গ͠લͷฐࣾ class MessagesController < ApplicationController def create @message = Message.new(message_params)

    @message.validate Rails.logger.debug @message.errors if params[:fix] @message.clear_confirmed render :new elsif @message.save redirect_to @message else render :new end end end 26
  13. build @model @model.valid? .check_confirming .confirmed params['fix'] render :new .save! redirect

    POST :create true false blank? present? present? blank? .clear_confirmed 27 confirmed = '1'
  14. 28

  15. Confirm Action / new.html.slim h1 | New User = form_for

    @user, url: { action: :confirm } do |form| = render 'form', user: @user, form: form = link_to 'Back', users_path 31
  16. Confirm Action class UsersController < ApplicationController def confirm @user =

    User.new(user_params) if @user.valid? render :confirm else flash.now[:error] = "Validation error" render :new end end # continue 32
  17. Confirm Action / confirm.html.slim h1 Confirm = form_for @user, url:

    { action: :create } do |f| = f.hidden_field :name h2 Name p = @user.name = f.submit 'ૹ৴' = f.submit 'मਖ਼', name: 'fix' 33
  18. Confirm Action def create @user = User.new(user_params) if params['fix'] render

    :new elsif @user.save redirect_to @user else flash.now[:error] = "Validation error" render :new end end end 34 ʮमਖ਼ʯ OK NG (ແཧ͠ͳ͍ͱى͖ͳ͍)
  19. build @user @user.valid? render :confirm @user.valid? render :new (΍Γ௚͠) @user.save!

    redirect POST :create 35 POST :confirm params['fix'] true false present? blank? false true
  20. build @model @model.valid? .check_confirming .confirmed params['fix'] render :new .save! redirect

    POST :create true false blank? present? present? blank? .clear_confirmed 36 (࠶ܝ)