Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
Rails Context Validation
kbaba1001
December 08, 2014
Technology
2
620
Rails Context Validation
Validation Night (
http://connpass.com/event/9982/
)
kbaba1001
December 08, 2014
Tweet
Share
More Decks by kbaba1001
See All by kbaba1001
Word Penne
kbaba1001
0
43
I live by using a minor language
kbaba1001
0
73
fast optical line
kbaba1001
0
230
ArtPosePro and Procreate
kbaba1001
1
44
How did Clojure change my life
kbaba1001
3
1.3k
The Pragmatic Hanami
kbaba1001
0
1.5k
Recent writing of my Rails
kbaba1001
2
460
Trailblazerの紹介
kbaba1001
3
3.9k
Trailblazerを業務で使ってみた
kbaba1001
5
5.1k
Other Decks in Technology
See All in Technology
SRENEXT2022 組織にSREを実装していくまでの道のり
marnie0301
1
250
次期LTSに備えよ!AOS 6.1 HCI Core 編
smzksts
0
170
20220510_簡単にできるコスト異常検出(Cost Anomaly Detection) /jaws-ug-asa-cost-anomaly-detection-20220510
emiki
2
310
mROS 2のススメ
takasehideki
0
290
Babylon.jsで3DViewerを作ってみた!!!
iwaken71
1
910
AWSの基礎を学ぼうで学んだ9種類のDBを勝手にふりかえる
98lerr
2
720
~スタートアップの人たちに捧ぐ~ 監視再入門 in AWS
track3jyo
PRO
31
8.6k
LINEスタンプの実例紹介 小さく始める障害検知・対応・振り返りの 改善プラクティス
line_developers
PRO
3
1.4k
暗号資産ウォレット入門(MetaMaskの入門~NFTの購入~詐欺の注意事項など)
kayato
2
180
New Features in C# 10/11
chack411
0
850
How We Foster Reliability in Diversity
nari_ex
PRO
9
2.4k
5分で完全理解するGoのiota
uji
3
2k
Featured
See All Featured
Gamification - CAS2011
davidbonilla
75
3.9k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
3
430
What’s in a name? Adding method to the madness
productmarketing
11
1.5k
Become a Pro
speakerdeck
PRO
3
770
5 minutes of I Can Smell Your CMS
philhawksworth
196
18k
A Tale of Four Properties
chriscoyier
149
20k
The Straight Up "How To Draw Better" Workshop
denniskardys
225
120k
Large-scale JavaScript Application Architecture
addyosmani
499
110k
From Idea to $5000 a Month in 5 Months
shpigford
372
44k
Code Reviewing Like a Champion
maltzj
506
37k
Embracing the Ebb and Flow
colly
73
3.3k
What the flash - Photography Introduction
edds
61
9.9k
Transcript
Rails Context Validation Rails Context Validation @kbaba1001 Powered by Rabbit
2.1.3 and COZMIXNG
自己紹介 @kbaba1001 永和システムマネジメント Ruby on Rails
ぼっち牧場
今日の話 Rails で状況によって変化するバリ デーションを作る。
なんで? ウィザードを作ったら画面ごとに 異なるバリデーションが必要にな った。
validates メソッド 状況によってバリデーションを変 えるためのオプション -> if、unless、on
if オプション validates :hoge, presence: true, if: -> { first_login?
} validates :fuga, presence: true, if: :fuga_true? def fuga_true? # ... end
with_options with_options if: -> { first_login? } do |a| a.validates
:hoge, presence: true a.validates :fuga, presence: true end
入れ子 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
入れ子 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
入れ子 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
( ˘ω˘) 入れ子とはなんだったのか…
抜け道
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
(o´・∀・`) イエーイ
牧場行こ…
つらい 読みにくい 画面に依存しがち
onオプションを使おう
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 のバリデーションが適用される
呼び出す側に条件を移す if first_login? Model.save(context: :first_login) if admin? Model.save(context: :admin) end
end
複数指定できない # 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]) # これも無理
複数のcontext if hoge.valid?(:first_login) && hoge.valid?(:create) hoge.save!(validate: false) end
複雑になると… with_options on: :create { ... } with_options on: :api
{ ... } with_options on: :web { ... } with_options on: :first_login { ... } with_options on: :withdrawn { ... } (´;ω;`)ウッ…
そもそも設計を見直す バリデーション用クラスを作る DBテーブルとモデルを分ける
まとめ if、unless 辛い on を使う 設計を見直す
マザー牧場へのアクセス 東京駅 (総武線) 君津駅 (内房線) 佐貫町駅 無料送迎バス Powered by Rabbit
2.1.3 and COZMIXNG