はじめに
抽象レイヤーを提供してくれるGem,Trailblazerの存在を知り勉強がてらにCreateを試してみた。
Trailblazerの概要については他の記事でわかりやすく説明していただいてるので割愛とする。
こちらの記事がとてもわかりやすかったです。
TrailBlazer概要まとめてみた
環境
ruby '2.7.2'
'rails', '~> 6.0.3'
template engine: haml
Create
Trailblazerのディレクトリ構成
.
└── todo
├── cell
│ ├── index.rb
│ └── new.rb
├── contract
│ └── form.rb
├── operation
│ ├── create.rb
│ └── index.rb
└── view
├── form.haml
├── index.haml
└── new.haml
Operation
module Todo::Operation
class Create < Trailblazer::Operation
class Present < Trailblazer::Operation
step Model(Todo, :new)
step Contract::Build( constant: Todo::Contract::Form )
end
step Subprocess(Present) # present classのstep呼び出し
step Contract::Validate(key: :todo) # contractを使ってバリデーション
step Contract::Persist() # モデルに保存する
end
end
Contract
module Todo::Contract
class Form < Reform::Form
include Reform::Form::ActiveModel
property :title
property :description
property :completed
validates :title, presence: true
validates :description, length: { minimum: 2 }
# overrideもできる
# def title
# super.capitalize
# end
end
end
Cell
module Todo::Cell
class New < Trailblazer::Cell
include ActionView::RecordIdentifier
include ActionView::Helpers::FormOptionsHelper
include SimpleForm::ActionViewExtensions::FormHelper
end
end
View
= simple_form_for(model, html: {novalidate: true}) do |f|
= f.input :title, placeholder: "Title"
%br
= f.input :description, as: :text, placeholder: "Description"
%br
= f.submit 'Submit'
= link_to 'Back', todos_path
確認
今回試したプロジェクト