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