English | 日本語
Rails で型安全な API パラメータバリデーションとフォームオブジェクトを実現する gem
StructuredParams は、以下の課題を解決します:
- API エンドポイント: リクエストパラメータの型チェック・バリデーション・自動キャスト
- フォームオブジェクト: 複雑なフォーム入力の検証とモデルへの変換
ActiveModel をベースに、ネストしたオブジェクトや配列も簡単に扱えます。
- ✅ API パラメータバリデーション - 型安全なリクエスト検証
- ✅ フォームオブジェクト - 複雑なフォームロジックのカプセル化
- ✅ ネスト構造対応 - オブジェクトや配列を自動キャスト
- ✅ Strong Parameters 統合 - permit リストを自動生成
- ✅ ActiveModel 互換 - バリデーション、シリアライゼーションなど標準機能をサポート
- ✅ RBS 型定義 - 型安全な開発体験
# インストール
gem 'structured_params'
# 初期化
StructuredParams.register_typesclass AddressParams < StructuredParams::Params
attribute :street, :string
attribute :city, :string
end
class UserParams < StructuredParams::Params
attribute :name, :string
attribute :age, :integer
attribute :score, :integer
attribute :tags, :array, value_type: :string # プリミティブ配列
attribute :address, :object, value_class: AddressParams # ネストオブジェクト
# 型変換前の生文字列をバリデーション
validates_raw :score, format: { with: /\A\d+\z/, message: 'must be numeric string' }
validates :name, presence: true
validates :age, numericality: { greater_than: 0 }
validates :score, numericality: { greater_than_or_equal_to: 0 }
end
# API コントローラーで使用
def create
user_params = UserParams.new(params)
if user_params.valid?
User.create!(user_params.attributes)
else
render json: { errors: user_params.errors }, status: :unprocessable_entity
end
endvalue_type を使うとプリミティブ型の配列を扱えます。Strong Parameters では配列フォーマット(tags: [])で許可されます。
class UserParams < StructuredParams::Params
attribute :tags, :array, value_type: :string
end
# 相当する Strong Parameters:
# params.permit(tags: [])class UserRegistrationForm < StructuredParams::Params
attribute :name, :string
attribute :email, :string
attribute :terms_accepted, :boolean
validates :name, :email, presence: true
validates :terms_accepted, acceptance: true
end
# コントローラーで使用
# permit は params.require(:user_registration).permit(...) を内部で呼び出す
# API と異なり、フォームオブジェクトでは require によるキー絞り込みが必要なため permit を使う
def create
form = UserRegistrationForm.new(UserRegistrationForm.permit(params))
if form.valid?
User.create!(form.attributes)
redirect_to root_path
else
render :new
end
end- インストールとセットアップ - StructuredParams の始め方
- 基本的な使用方法 - パラメータクラス、ネストオブジェクト、配列
- バリデーション - ネスト構造での ActiveModel バリデーション使用
- Strong Parameters - 自動 permit リスト生成
- エラーハンドリング - フラットと構造化エラーフォーマット
- シリアライゼーション - パラメータのハッシュと JSON 変換
- フォームオブジェクト - Rails ビューとのフォームオブジェクトパターン
バグレポートやプルリクエストは GitHub の https://github.com/Syati/structured_params で歓迎しています。
この gem は MIT License の条件の下でオープンソースとして利用可能です。