Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
Rails Context Validation Rails Context Validation @kbaba1001 Powered by Rabbit 2.1.3 and COZMIXNG
Slide 2
Slide 2 text
自己紹介 @kbaba1001 永和システムマネジメント Ruby on Rails
Slide 3
Slide 3 text
ぼっち牧場
Slide 4
Slide 4 text
今日の話 Rails で状況によって変化するバリ デーションを作る。
Slide 5
Slide 5 text
なんで? ウィザードを作ったら画面ごとに 異なるバリデーションが必要にな った。
Slide 6
Slide 6 text
validates メソッド 状況によってバリデーションを変 えるためのオプション -> if、unless、on
Slide 7
Slide 7 text
if オプション validates :hoge, presence: true, if: -> { first_login? } validates :fuga, presence: true, if: :fuga_true? def fuga_true? # ... end
Slide 8
Slide 8 text
with_options with_options if: -> { first_login? } do |a| a.validates :hoge, presence: true a.validates :fuga, presence: true end
Slide 9
Slide 9 text
入れ子 with_options if: -> { first_login? } do |a| a.validates :hoge, presence: true with_options if: -> { admin? } do |b| b.validates :foo, presence: true end end
Slide 10
Slide 10 text
入れ子 with_options if: -> { first_login? } do |a| a.validates :hoge, presence: true # ここではfirst_login?が無効 with_options if: -> { admin? } do |b| b.validates :foo, presence: true end end
Slide 11
Slide 11 text
入れ子 with_options if: -> { first_login? } do |a| a.validates :hoge, presence: true # first_login? も書く必要がある with_options if: -> { first_login? && admin? } do |b| b.validates :foo, presence: true end end
Slide 12
Slide 12 text
( ˘ω˘) 入れ子とはなんだったのか…
Slide 13
Slide 13 text
抜け道
Slide 14
Slide 14 text
unlessオプション with_options if: -> { first_login? } do |a| a.validates :hoge, presence: true # if オプションを上書きしないで済む with_options unless: -> { !admin? } do |b| b.validates :foo, presence: true end end
Slide 15
Slide 15 text
(o´・∀・`) イエーイ
Slide 16
Slide 16 text
牧場行こ…
Slide 17
Slide 17 text
つらい 読みにくい 画面に依存しがち
Slide 18
Slide 18 text
onオプションを使おう
Slide 19
Slide 19 text
onオプション # Model validates :hoge, presence: true, on: :first_login validates :fuga, presence: true, on: :create # Controller Model.save(context: :first_login) Model.create # on: :create のバリデーションが適用される
Slide 20
Slide 20 text
呼び出す側に条件を移す if first_login? Model.save(context: :first_login) if admin? Model.save(context: :admin) end end
Slide 21
Slide 21 text
複数指定できない # Model validates :hoge, presence: true, on: :first_login validates :fuga, presence: true, on: :create # Controller Model.create(context: :first_login) # これは無理 Model.save(context: [:first_login, :create]) # これも無理
Slide 22
Slide 22 text
複数のcontext if hoge.valid?(:first_login) && hoge.valid?(:create) hoge.save!(validate: false) end
Slide 23
Slide 23 text
複雑になると… with_options on: :create { ... } with_options on: :api { ... } with_options on: :web { ... } with_options on: :first_login { ... } with_options on: :withdrawn { ... } (´;ω;`)ウッ…
Slide 24
Slide 24 text
そもそも設計を見直す バリデーション用クラスを作る DBテーブルとモデルを分ける
Slide 25
Slide 25 text
まとめ if、unless 辛い on を使う 設計を見直す
Slide 26
Slide 26 text
マザー牧場へのアクセス 東京駅 (総武線) 君津駅 (内房線) 佐貫町駅 無料送迎バス Powered by Rabbit 2.1.3 and COZMIXNG