冒险村26 - Design Pattern(6) - Form Object

26 - Design Pattern(6) - Form Object

相信从名字上就很好知道,主要在处理 form 表单打到後端时,到资料库的验证问题,可以先来看一先如果没有额外拆出来通通写在 model 内会发生的状况,不只逻辑会变非常的长,还会发生如果到时候整个重新设计要改逻辑,其他地方也要全部一起重新验证,甚至是把其他的验证改坏了。

光看可能一堆的逻辑,想完就忘了,结果要边改逻辑的时候,又再继续想一次XDD

  # model user.rb

  validates :first_name, presence: true, if: :individual_required?
  validates :last_name, presence: true, if: :individual_required?
  # ...

  def individual_required?
    (!quickmode? || (quickmode? && !new_record? && confirmed? && !resetting_password?)) && individual?
  end

建议拆出来的写法,举例来说像是把登入、登出拆成两个 form,然後对各自的栏位做验证,可以参考以下:

Create app/forms folder

  • sign_in_form.rb
  • sign_up_form.rb

Add app > forms > users > sign_in_form.rb

  # frozen_string_literal: true
  module Users
    class SignInForm
      include ActiveModel::Model

      attr_accessor :email, :password
      validates :email, :password
    end
  end
  # Sign in
  user = Users::SignInForm.new(user_params)
  sign_in(user) if user.valid?

Add app > forms > users > sign_up_form.rb

  # frozen_string_literal: true
  module Users
    class SignUpForm
      include ActiveModel::Model

      attr_accessor :email, :password, :first_name, :last_name
      validates :email, :password, :first_name, :last_name

      def save
        return false unless valid?

        # save user
      end
    end
  end
  # Sign up
  user = Users::SignUpForm.new(user_params)
  user.save

也可以再 active_record_validations custom-methods

参考资料

My blog


<<:  Day26 NiFi 场景应用范例 (一)

>>:  [Day26] QA 与系统

[GAS] Genero GAS 控制台网页版 (3.20後套件提供)

在设定 GAS demos.html 时,我们能看到3.20後的版本多了一个区块 此区块即为新增的网...

[DAY12]跟 Vue.js 认识的30天 - Vue 模组资料传递(`props`)

props 的命名及使用 HTML attribute 是大小写不敏感的,所以必须要注意 prop ...

Day 23 资料宝石:【Lab】RDS架构 建立自己的第一台云端资料库 (下)

今天我们来示范如何让一台 EC2 Instance 连线使用之前创建好的 RDS Instance...

Backtrader - 指标使用

以下内容皆参考 Backtrader 官网 在评估股票的时候,我们常常会用一些指标来辅助,今天来介绍...