Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Rails Context Validation
Search
kbaba1001
December 08, 2014
Technology
2
770
Rails Context Validation
Validation Night (
http://connpass.com/event/9982/
)
kbaba1001
December 08, 2014
Tweet
Share
More Decks by kbaba1001
See All by kbaba1001
How to build a video conferencing system that no one has ever told you about
kbaba1001
0
42
Build React system with ClojureScript (Squint)
kbaba1001
0
120
talk-with-local-llm-with-web-streams-api
kbaba1001
0
440
Lume: Static Site Generator
kbaba1001
0
610
React_2023
kbaba1001
0
170
Word Penne
kbaba1001
0
210
I live by using a minor language
kbaba1001
1
170
fast optical line
kbaba1001
0
370
ArtPosePro and Procreate
kbaba1001
1
210
Other Decks in Technology
See All in Technology
.NET 10の概要
tomokusaba
0
100
モダンデータスタック (MDS) の話とデータ分析が起こすビジネス変革
sutotakeshi
0
480
mairuでつくるクレデンシャルレス開発環境 / Credential-less development environment using Mailru
mirakui
4
390
ログ管理の新たな可能性?CloudWatchの新機能をご紹介
ikumi_ono
1
700
文字列の並び順 / Unicode Collation
tmtms
3
580
乗りこなせAI駆動開発の波
eltociear
1
1.1k
AIプラットフォームにおけるMLflowの利用について
lycorptech_jp
PRO
1
130
Lambdaの常識はどう変わる?!re:Invent 2025 before after
iwatatomoya
1
490
[CMU-DB-2025FALL] Apache Fluss - A Streaming Storage for Real-Time Lakehouse
jark
0
120
re:Invent 2025 ふりかえり 生成AI版
takaakikakei
1
200
Challenging Hardware Contests with Zephyr and Lessons Learned
iotengineer22
0
190
Debugging Edge AI on Zephyr and Lessons Learned
iotengineer22
0
180
Featured
See All Featured
It's Worth the Effort
3n
187
29k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
8.3k
The Cult of Friendly URLs
andyhume
79
6.7k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Producing Creativity
orderedlist
PRO
348
40k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Scaling GitHub
holman
464
140k
How GitHub (no longer) Works
holman
316
140k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
132
19k
Building Adaptive Systems
keathley
44
2.9k
Faster Mobile Websites
deanohume
310
31k
We Have a Design System, Now What?
morganepeng
54
7.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