Rails: Form ObjectとVirtusを使って属性をサニタイズする(翻訳)

概要 原著者の許諾を得て翻訳・公開いたします。 英語記事: Sanitize your attributes through your form object 原文公開日: 2017/10/17 著者: Jean Anquetil サイト: drivy.engineering — 自動車の所有という概念の変革を目指すスタートアップ企業です。 Form Objectパターンについては「肥大化したActiveRecordモデルをリファクタリングする7つの方法(翻訳)」もご覧ください。 Rails: Form ObjectとVirtusを使って属性をサニタイズする(翻訳) 私たちはDrivyのコードベースで、Form ObjectのビルドにVirtus gemを使っています。これによって以下のメリットを得られました。 コントローラやビューにビジネスロジックを含めないようにする 永続しない属性を取り扱える 特定のバリデーションを、モデルに直接追加せずに追加できる カスタムのデータバリデーションをフォームに直接表示できる includeすることで機能をActiveModel::Modelから使える ユーザー入力のサニタイズ、データの整形、スペースの除去といった作業が必要になったときに、Virtusを使って行える便利な方法をご紹介します。 #coerceを使う 文字列として記録されているVAT番号からスペースをすべて除去したいとします。シンプルなユースケースですが、このコンセプトはもっと複雑な状況にも適用できます。 まず、サニタイズ対象となる属性のカスタム属性オブジェクトを定義する必要があります。そのオブジェクトで#coerceメソッドを使うためにVirtus::Attributeの継承も必要です。次に、実行したい整形処理をメソッドに定義します。 class SanitizedVatNumber < Virtus::Attribute def coerce(value) value.respond_to?(:to_s) ? value.to_s.gsub(/\s+/, ”) : value end end 次はVirtusのForm Objectでvat_number属性(これが更新対象です)をSanitizedVatNumberとして指定します。 class CompanyForm attribute … Continue reading Rails: Form ObjectとVirtusを使って属性をサニタイズする(翻訳)