Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rails Context Validation

B49aa473d5cd7f08cdce3d56ef837f29?s=47 kbaba1001
December 08, 2014

Rails Context Validation

Validation Night ( http://connpass.com/event/9982/ )

B49aa473d5cd7f08cdce3d56ef837f29?s=128

kbaba1001

December 08, 2014
Tweet

Transcript

  1. Rails Context Validation Rails Context Validation @kbaba1001 Powered by Rabbit

    2.1.3 and COZMIXNG
  2. 自己紹介 @kbaba1001 永和システムマネジメント Ruby on Rails

  3. ぼっち牧場

  4. 今日の話 Rails で状況によって変化するバリ デーションを作る。

  5. なんで? ウィザードを作ったら画面ごとに 異なるバリデーションが必要にな った。

  6. validates メソッド 状況によってバリデーションを変 えるためのオプション -> if、unless、on

  7. if オプション validates :hoge, presence: true, if: -> { first_login?

    } validates :fuga, presence: true, if: :fuga_true? def fuga_true? # ... end
  8. with_options with_options if: -> { first_login? } do |a| a.validates

    :hoge, presence: true a.validates :fuga, presence: true end
  9. 入れ子 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
  10. 入れ子 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
  11. 入れ子 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
  12. ( ˘ω˘) 入れ子とはなんだったのか…

  13. 抜け道

  14. 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
  15. (o´・∀・`) イエーイ

  16. 牧場行こ…

  17. つらい 読みにくい 画面に依存しがち

  18. onオプションを使おう

  19. 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 のバリデーションが適用される
  20. 呼び出す側に条件を移す if first_login? Model.save(context: :first_login) if admin? Model.save(context: :admin) end

    end
  21. 複数指定できない # 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]) # これも無理
  22. 複数のcontext if hoge.valid?(:first_login) && hoge.valid?(:create) hoge.save!(validate: false) end

  23. 複雑になると… with_options on: :create { ... } with_options on: :api

    { ... } with_options on: :web { ... } with_options on: :first_login { ... } with_options on: :withdrawn { ... } (´;ω;`)ウッ…
  24. そもそも設計を見直す バリデーション用クラスを作る DBテーブルとモデルを分ける

  25. まとめ if、unless 辛い on を使う 設計を見直す

  26. マザー牧場へのアクセス 東京駅 (総武線) 君津駅 (内房線) 佐貫町駅 無料送迎バス Powered by Rabbit

    2.1.3 and COZMIXNG