プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • Ruby on Rails
  • 【Ruby on Rails】「ActiveModel」、「フォームオブジェクト」、「Ea…
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【Ruby on Rails】「ActiveModel」、「フォームオブジェクト」、「EachValidator」、「単一テーブル継承(STI)」

11.29

  • miyabisan2
  • コメントを書く

この記事は3分で読めます

ActiveModelとは?

非ActiveRecordのソースを複雑にしているデータや処理のまとまりを見つけてそれをクラスにする等の機能のことです。

ActiveModelの代表的なサブモジュール

ActiveModelはいくつかのサブモジュールから構成されます。

モジュール名 機能
AttributeAssignment attr_accessor等で定義した属性値へのアクセサメソッドに対してHashで値を割り当てる「assign_attributes」メソッドを定義する。
Naming モデル名を便利に扱う「model_name」クラスメソッドを定義する。これから得られるオブジェクトに対してRailsはi18nやrouting等の類推を行う。
Conversion オブジェクト情報からURLパラメータ生成やパーシャルパスの解決ができる。
Translation 「human_attribute_name」メソッドを通じてi18nによる変換を利用できるようにする。この機能を使ってフォームヘルパーは自動で属性名を変換したりする。
Validations バリデーションやバリデーションオブジェクトの「errors」メソッドを扱えるようにする。

フォームオブジェクトとは?

「非ActiveRecordモデル」のインスタンスです。form_withメソッドのmodelオプションに紐づけることができます。

用途

「データベースとは無関係なフォーム」や「データベースのテーブルと1:1に紐づいていないフォーム」をform_withメソッドで生成することができます。

作成ディレクトリ

Railsプロジェクトの下記のディレクトリで作成する場合が多いです。

1
app/forms

実際の業務では、さらにサブディレクトリを作成して「名前空間::xxxForm」というフォームオブジェクトのクラス指定をしていることも多いです。

実装方法

フォームオブジェクトの作成方法

1
2
3
4
5
class 名前空間(ディレクトリに切っていた場合)::xxxForm
  include ActiveModel::Model
 
  attr_accessor :フォームのフィールド名1, :フォームのフィールド名2
end

ポイントとしては下記の2点です。これを守ればform_withのmodelで使用することです。

  • ActiveModel::Modelをincludeすること
  • ActiveRecord::Baseクラスを継承しないこと

attr_accessorで指定したフィールドはform_with内で使用できるフィールド名になります。

呼び出し方

コントローラで下記のようにフォームオブジェクトを変数に格納します。

1
@form = 名前空間名::フォームオブジェクト名.new

ビュー側では下記のように指定します。

1
2
3
  <%= form_with model: @form, url: :パス do |f| %>
    ‥
  <% end %>

EachValidator

「ActiveModel::EachValidator」を使えば、バリデーション用のクラスを作ることができます。

呼び出し元

lib/validator/email_validator.rb

1
2
3
4
5
class EmailValidator < ActiveModel::EachValidator
    def validate_each(record, attribute, value)
        record.errors.add(attribute, :too_long, count: max) if value.length > 100
    end
end

emailのバリデーターであれば上記のように「EmailValidater」というクラス名にします。emailという名前で呼び出すことが可能になります。

validate_eachメソッド

byebugを仕込んで、モデル名.createメソッドを実行すれば中身を確認することができます。

record

これから登録しようとするモデルのオブジェクトが入っています。

1
errors.add(属性,エラーメッセージ)

attribute

属性が入っています。

value

登録しようとしている値が入っています。

呼び出し先

Railsのオートローダーの「Zeitwerk」ではlibディレクトリ配下は自動でロードしてくれないのでrequireで明示的に呼び出す必要があります。

1
2
3
4
5
require "validator/email_validator"
 
class User < ApplicationRecord
    validates :email
end

単一テーブル継承(STI)とは?

オブジェクト指向の継承をRDBMSで疑似的に実現する方法です。Railsではtypeカラムにクラス名を記録することで実現することが可能です。

実装方法

modelのクラスを下記のように親クラスと子クラスでそれぞれ作成して子クラスには親クラスを継承させます。

1
2
3
4
5
6
7
8
class 親クラス < ApplicationRecord
end
 
class 子クラス1 < 親クラス
end
 
class 子クラス2 < 親クラス
end

保存

Railsのプログラム内で下記のように保存処理を記述します。

1
2
子クラス1.create(親クラスの列: "1001")
子クラス2.create(親クラスの列: "1003")

実際にテーブルに格納されるレコードは下記のようになります。typeカラムはRailsが自動的に設定してくれます。

id type レコード名
1 子クラス1 1001
2 子クラス2 1003

取得

下記のように取得します。なお、サブクラス1に対応するレコードがなければレコードが見つからないというエラーになってしまうので注意です。

1
2
サブクラス1.find(1)
サブクラス2.find(2)

スポンサーリンク
  • 2020 11.29
  • miyabisan2
  • コメントを書く
  • Ruby on Rails
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2018 06.23

    【Ruby on Rails】「Scaffolding(スキャフォールディング)」生成されたソースコード、jbuilder

  2. 2020 12.19

    【Ruby on Rails】モデルの基本、データ型、scope、メソッド(クラス、インスタンス)の違い、委譲

  3. 2019 12.07

    【Ruby on Rails】「Active Job」でジョブを非同期実行する。(Sidekiq)

  4. 2020 11.02

    【Ruby on Rails】「Redis」の基本、Railsへの導入

  5. 2021 02.06

    【Rails】「find_or_initialize_by」や「find_or_create_by」について

  6. 2020 12.19

    【Ruby on Rails】「アソシエーション(has_many)」のオプション

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【SEO】SEOとURLの関係、サイトマップ、OGP

【システム開発】バリデーションのポイント

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー