en
Feedback
ToCode

ToCode

Open in Telegram

讟讬驻讬诐 拽爪专讬诐 诇诪转讻谞转讬诐 诪讗转 讬谞讜谉 驻专拽

Show more
1 419
Subscribers
No data24 hours
No data7 days
-230 days
Posts Archive
ToCode
1 419
# 诇诪讬讚讛 讟讘注讬转 讗诐 讗谞讞谞讜 诪住转讻诇讬诐 专讙注 诪讞讜抓 诇注讜诇诐 砖诇 讻讬转讜转 诇讬诪讜讚 讜讻诇 诪注专讻转 讛讛砖讻诇讛, 拽诇 诇专讗讜转 砖诇诪讬讚讛 拽讜专讬转 讻诇 讛讝诪谉: 讙诐 讘诇讬 诪讜专讬诐, 讘诇讬 转诇诪讬讚讬诐 讜讘诇讬 诇讜讞. 转讬谞讜拽讜转 诇讜诪讚讬诐 诇诇讻转 讜诇讚讘专, 讬诇讚讬诐 讙讚讜诇讬诐 讬讜转专 诇讜诪讚讬诐 讗转 讛讞讜拽讬诐 讛讞讘专转讬讬诐 砖诇 讛注讜诇诐 砖住讘讬讘诐 讜诪讘讜讙专讬诐 诇讜诪讚讬诐 诪讬讜诪谞讜讬讜转 讞讚砖讜转 诇讘讚, 诪转讜讱 谞讬住讜讬 讜讟注讬讛. 讛转讘讜谞谞讜转 讘诇诪讬讚讛 讟讘注讬转 讬讻讜诇讛 诇诇诪讚 讗讜转谞讜 讻诪讛 讚讘专讬诐 讞讚砖讬诐 砖讗讜诇讬 讬注讝专讜 诇谞讜 诇诇诪讜讚 讟讜讘 讬讜转专 讙诐 讘爪讜专讛 诪讻讜讜谞转. 讘讜讗讜 谞转讞讬诇 注诐 讝讛 - "讗讬讱 讘讗诪转 讗谞讞谞讜 诇讜诪讚讬诐 讘讬讜诐 讬讜诐?" . 讗驻砖专 诇拽讞转 讚讜讙诪讛 驻砖讜讟讛 诪讛讞讬讬诐 诇诪砖诇 砖诇 诇讬诪讜讚 诪讬诇讛 讞讚砖讛 讘砖驻讛: 1. 砖诇讘 专讗砖讜谉 讛讜讗 讞砖讬驻讛: 讗讜诇讬 谞转拽诇转讬 讘诪讬诇讛 讞讚砖讛 讘住驻专, 讘住专讟, 讘砖讬讞讛 注诐 讞讘专讬诐. 讗讬驻砖讛讜 砖诪注转讬 诪讬诇讛 砖诇讗 讛讻专转讬. 2. 讛专讘讛 驻注诪讬诐 讗谞讬 讗讝专讜拽 讗转 讝讛, 讗谞讬 讗讞诇讬拽 讗转 讝讛 砖讗谞讬 诇讗 诪讻讬专 诪讬诇讛 讜讗诪砖讬讱 讛诇讗讛 讘讞讬讬诐. 讗讘诇 诇驻注诪讬诐 讗谞讬 讘讜讞专 诇讛转讞讬诇 转讛诇讬讱 诇讬诪讜讚 - 讛砖诇讘 讛砖谞讬 讘转讛诇讬讱 讛讜讗 讗讬住讜祝 诪讬讚注: 讗谞讬 讬讻讜诇 诇砖讗讜诇 讗转 讛讞讘专讬诐 诪讛 诪砖诪注讜转 讛诪讬诇讛 讗讜 诇讞驻砖 讘诪讬诇讜谉. 讗讜诇讬 讗谞讬 诪讞驻砖 讘讻诪讛 诪拽讜专讜转 讗讜 讘讙讜讙诇 转诪讜谞讜转 讻讚讬 诇专讗讜转 讗讬讱 讝讛 谞专讗讛. 诇讗讟 诇讗讟 讗谞讬 讗讜住祝 注讜讚 诪讬讚注 注诇 讛讚讘专 讛讞讚砖 砖诇诪讚转讬. 3. 讗讞专讬 砖讗谞讬 讬讜讚注 诪住驻讬拽 讗谞讬 诪诪砖讬讱 诇砖诇讘 讛砖诇讬砖讬: 砖讬诪讜砖 讜砖讬驻讜专. 讗谞讬 讬讻讜诇 诇驻讙讜砖 讞讘专 讜驻转讗讜诐 诇讝专讜拽 讗转 讛诪讬诇讛 讛讞讚砖讛 讛讝讗转 讘砖讬讞讛. 诇驻注诪讬诐 讝讛 讬爪诇讬讞 讜讛讞讘专 讬讘讬谉 讗转 讛讻讜讜谞讛, 诇驻注诪讬诐 讛讞讘专 讬转拽谉 讗转 讛讛讙讬讛 砖诇讬 讜诇驻注诪讬诐 讛讞讘专 讬住转讻诇 注诇讬讬 讘诪讘讟 注拽讜诐 讻讬 讛砖转诪砖转讬 讘诪讬诇讛 讘诪拽讜诐 诇讙诪专讬 诇讗 讛讙讬讜谞讬. 讻讻诇 砖讗谞讬 诪砖转诪砖 讬讜转专 讘诪讬诇讛, 讜诪拽讘诇 讬讜转专 驻讬讚讘拽 讗讬讻讜转讬, 讻讱 讗谞讬 诇讜诪讚 注讜讚 注诇 讛诪砖诪注讜转 砖诇讛 讜诪讟诪讬注 讗讜转讛 讘讬讻讜诇转 讛诇砖讜谞讬转 砖诇讬. 砖讜讜讛 诇砖讬诐 诇讘 砖砖诇讜砖转 砖诇讘讬诐 讗诇讛 诪砖讞拽讬诐 转驻拽讬讚 讘讻诇 转讛诇讬讱 诇讬诪讜讚 砖谞讘爪注. 讻讻诇 砖谞砖讬诐 诇讘 讗诇讬讛诐 讜谞讚注 讘讗讬讝讛 砖诇讘 讗谞讞谞讜 讘诇讬诪讜讚 讬讛讬讛 诇谞讜 讬讜转专 拽诇 诇讛转诪讬讚 讜诇诪爪讜讗 诇注爪诪谞讜 讗诪爪注讬 诇讬诪讜讚 砖诪转讗讬诪讬诐 诇讗讜转讜 讛砖诇讘.

ToCode
1 419
# 转讛诇讬讱 砖诇 诇诪讬讚讛 诇讻诇 诪转讻谞转 讜诪转讻谞转转 砖讗谞讬 诪讻讬专 讬砖 专砖讬诪讛 诪讻讜讘讚转 砖诇 讟讻谞讜诇讜讙讬讜转 讞讚砖讜转 砖讗谞讞谞讜 专讜爪讬诐 诇诇诪讜讚 (讗讜 诇诇诪讜讚 讬讜转专 诇注讜诪拽). 讝讛 讬讻讜诇 诇讛讬讜转 驻讬转讜讞 讗驻诇讬拽爪讬讜转, 驻讬转讜讞 诪砖讞拽讬诐, 诇诪讬讚转 诪讻讜谞讛, Kernel, 专砖转讜转, 讛讗拽讬谞讙. 讚讘专 讗讞讚 诪砖讜转祝 诇讻讜诇谞讜: 诇讻诇 讗讞讚 讜讗讞转 讬砖 讗讬讝讜 专砖讬诪讛 讘诇讘. 讜讘讙诇诇 讗讜驻讬 讛注讜诇诐 讜讘讙诇诇 砖讻诇 讟讻谞讜诇讜讙讬讛 讞讚砖讛 砖诇讜诪讚讬诐 专拽 注讜砖讛 讞砖拽 诇诇诪讜讚 注讜讚 诪砖讛讜, 讛专砖讬诪讛 诇注讜诇诐 诇讗 谞讙诪专转. 讞诇拽 诪讛诪转讻谞转讬诐 诪住转讻诇讬诐 注诇 讛专砖讬诪讛 讜讞讜砖讘讬诐 - 讗谞讬 诇注讜诇诐 诇讗 讗爪诇讬讞 诇诇诪讜讚 讗转 讛讻诇, 讜诪诪讬诇讗 讬砖 诇讬 讻诇 讻讱 讛专讘讛 诪讛 诇注砖讜转 注诐 讛讚讘专讬诐 砖讗谞讬 讻讘专 讬讜讚注, 讗讝 讗驻砖专 诇讛砖讗讬专 讗讜转讛 讘讛拽驻讗讛. 讬讜诐 讗讞讚 讻砖讬讛讬讛 讝诪谉 (讗讜 讻砖讛讘讜住 讬讬转谉 诇讬 讝诪谉 诇讬诪讜讚) 讗谞讬 讗讘讞专 讗讬讝讛 谞讜砖讗 砖诐 讜讗诇诪讚 讗讜转讜 讬讜转专 诇注讜诪拽. 讜讗讞专讬诐 诪住转讻诇讬诐 注诇 讛专砖讬诪讛 讘讗讜驻讟讬诪讬讜转, 注诐 诪讞砖讘讛 砖诇 "讗讬讝讛 讻讬祝 砖转诪讬讚 讬砖 注讜讚 诪砖讛讜 诇诇诪讜讚", 讻讻讛 讗谞讬 讬讻讜诇 诇讛拽讚讬砖 砖注讛 讘讬讜诐 诇诇诪讬讚讛 讜转诪讬讚 讬讛讬讛 诇讬 诪砖讛讜 诪注谞讬讬谉 砖讬诪诇讗 讗讜转讛. 讗诇 转转讬讬讗砖讜 诪诪砖讬诪讜转 讗讬谞住讜驻讬讜转, 讻诇 诪讛 砖爪专讬讱 讝讛 诇砖谞讜转 讗转 谞拽讜讚转 讛诪讘讟 讜诇讛诪砖讬讱 拽讚讬诪讛.

ToCode
1 419
# 讘讗讙 专讬驻讜专讟: 讘注讬讬转 拽讜谞驻讬讙讜专爪讬讛 讘 haproxy 讗谞讬 专讜爪讛 诇驻转讜讞 驻讛 诪讚讜专 讞讚砖 讘讘诇讜讙 砖谞拽专讗 "讘讗讙 专讬驻讜专讟" - 诇讗, 讗谞讬 诇讗 讛讜诇讱 诇讚讜讜讞 诇讗祝 讗讞讚 注诇 讘讗讙讬诐 讜诪拽讜讜讛 砖讙诐 讗转诐 诇讗 转讚讜讜讞讜 诇讬 注诇 讘讗讙讬诐. 讛讻讜讜谞讛 讛讬讗 诇拽讞转 讘讗讙 砖谞转拽注转讬 注诇讬讜 (讗讜 砖讗转诐 谞转拽注转诐 注诇讬讜 讜砖讬转驻转诐 讗讜转讬) 讜诇驻专拽 讗讜转讜 讻讚讬 砖诇讗 谞爪讟专讱 诇注砖讜转 砖讟讜讬讜转 讻讗诇讛 砖讜讘. 讜讛讬讜诐 讘讘讗讙 专讬驻讜专讟 - 讘注讬讬转 拽讜谞驻讬讙讜专爪讬讛 讘 haproxy 砖诇拽讞 诇讬 讛专讘讛 讬讜转专 诪讚讬 讝诪谉 诇诪爪讜讗. ## 诪讛 讛诪砖转诪砖讬诐 专讗讜 诪砖转诪砖讬诐 砖谞讻谞住讜 诇诪注专讻转 讘讛 讛讬转讛 讛讘注讬讛 拽讬讘诇讜 讗转 讛诪注专讻转 转拽讬谞讛 讘讞诇拽 诪讛讝诪谉, 讜讘讞诇拽 讗讞专 诪讛讝诪谉 拽讬讘诇讜 讛讜讚注讜转 砖讙讬讗讛 诪讜讝专讜转 注诐 讛拽讜讚 503. 诇讗 谞专讗讛 砖讬砖 讞讜拽讬讜转 诪转讬 诪拽讘诇讬诐 转砖讜讘讛 转拽讬谞讛 讜诪转讬 砖讙讬讗转 503, 注讘讜专 讗讜转诐 URL-讬诐 诪诪砖. ## 诪讛 讗谞讬 专讗讬转讬 讛讚讘专 讛专讗砖讜谉 砖注讜砖讬诐 讻讚讬 诇驻注谞讞 讘注讬讜转 讻讗诇讛 讛讜讗 诇讛讘讬谉 诪讗讬讝讛 诪注专讻转 讜砖专转 讘讻诇诇 诪讙讬注讛 讛讘注讬讛. 专讜讘 讗转专讬 讛讜讜讘 讛讬讜诐 诪讜讞拽讬诐 讗转 讛 HTTP Headers 讻讚讬 诇讗 诇讛住讙讬专 砖讜诐 诪讬讚注, 讜诇讻谉 讛讚讘专 讛专讗砖讜谉 砖讗谞讞谞讜 注讜砖讬诐 讻砖爪专讬讱 诇讚讘讙 讘注讬讜转 诪住讜讙 讝讛 讛讜讗 诇注讚讻谉 讗转 讛拽讜谞驻讬讙讜专爪讬讛 砖诇 砖专转讬 讛讜讜讘 讜讚讜讜拽讗 讻谉 诇砖转讜诇 砖诐 讘讞讝专讛 讗转 讛 Headers 注诐 诪讝讛讬 讛砖专转. 讗讞专讬 讛驻注诇讛 诪讞讚砖 讜爪驻讬讛 讘 curl 讗驻砖专 讛讬讛 诇专讗讜转 砖诪讬 砖砖讜诇讞 讗转 讛讜讚注转 讛 503 讛讬讛 haproxy. 拽爪转 讞讬讟讜讟 讘转讬注讜讚 讛专讗讛 砖讛讗驻专讜拽住讬 讬砖诇讞 讛讜讚注讜转 503 讗诐 讛讜讗 诇讗 诪讜爪讗 砖专转 诪转讗讬诐 诇讛注讘讬专 讗诇讬讜 讗转 讛讘拽砖讛. 讗讘诇, 讗诐 讛讜讗 诇讗 讛讬讛 诪讜爪讗 砖专转 诪转讗讬诐 诇讛注讘讬专 讗诇讬讜 讗转 讛讘拽砖讛 讛讬讬谞讜 爪专讬讻讬诐 诇专讗讜转 讗转 讛砖讙讬讗讛 讘讻诇 驻谞讬讛 - 诇诪讛 讞诇拽 诪讛驻谞讬讜转 讻谉 讛爪诇讬讞讜 讜讞诇拽 诇讗? ## 讗讬驻讛 讛讬转讛 讛讘注讬讛 讗拽爪专 诇讻诐 讗转 讛讞驻讬专讜转 讘拽讘爪讬 讛诇讜讙, 讛砖讬谞讜讬讬诐 讛诪讬讜转专讬诐 讘拽讜谞驻讬讙讜专爪讬讛 讜讛讬讜转专-诪讚讬-砖注讜转 砖诇 拽专讬讗转 讗讜转谉 砖讜专讜转 讘拽讜讘抓 讛讛讙讚专讛 讜谞拽驻讜抓 讬砖专 诇讘诇讜拽 讛讘注讬讬转讬:
backend nginx
        option forwardfor header X-Real-IP
        reqadd X-Scheme:\ https if { ssl_fc }
        server nginx 127.0.0.1:80
        server nginx /var/run/nginx.sock
讛讘诇讜讙 诪讙讚讬专 讗转 nginx 讘转讜专 Backend 诇 Haproxy, 讗讘诇 诪讙讚讬专 砖转讬 讚专讻讬 讙讬砖讛 诇 nginx: 讙诐 讘讗诪爪注讜转 讛讻转讜讘转 127.0.0.1:80 讜讙诐 讘讗诪爪注讜转 Unix Socket. 诪讗讞专 讜 nginx 讛拽砖讬讘 专拽 注诇 驻讜专讟 80 讜诇讗 讚专讱 讛 socket, 讻诇 讛讘拽砖讜转 砖 Haproxy 谞讬住讛 诇砖诇讜讞 诇 server 讛砖谞讬 谞讻砖诇讜. ## 讗讬讱 讛讬讗 讛讙讬注讛 诇砖诐 讛转讞讘讬专 砖诇 Haproxy 砖诪讗驻砖专 诇讛讙讚讬专 诪住驻专 砖专转讬诐 讘转讜讱 Backend 讬讞讬讚 谞讜注讚 讘砖讘讬诇 砖谞讞诇拽 讗转 讛注讜诪住 讘讬谉 讻诪讛 砖专转讬诐. 讗讬谉 砖讜诐 讛讙讬讜谉 诇讻转讜讘 驻注诪讬讬诐 驻拽讜讚转 server 砖转讙讬注 诇讗讜转讜 砖专转 专拽 诪谞转讬讘 讗讞专. 讗驻讬诇讜 讗诐 讛 nginx 讻谉 讛讬讛 诪拽砖讬讘 注诇 讛 Socket 讝讛 讛讬讛 诪讬讜转专 - 爪专讬讱 讛讬讛 诇诪爪讜讗 讗转 讚专讱 讛转拽砖讜专转 讛诪讜注讚驻转 讜诇讛讬砖讗专 讗讬转讛. 讛砖注专讛 砖诇讬 砖驻注诐 讝讛 注讘讚 注诐 Unix Socket, 诪讬砖讛讜 讛讞诇讬祝 讗转 讝讛 诇 TCP 讜讗讝 砖诐 讗转 砖讜专转 讛 Socket 讘讛注专讛, 讜诪转讬砖讛讜 (诇讗 讘专讜专 诪转讬) 诪讬砖讛讜 讛讜爪讬讗 诪讛注专讛 (讻谞专讗讛 讘讟注讜转) 讗转 砖讜专转 讛讛讗讝谞讛 诇 socket. ## 讗讬讱 讗驻砖专 诇砖诪讜专 砖诇讗 谞注砖讛 砖讟讜讬讜转 讻讗诇讛 砖讜讘 诇诪专讜转 砖讛讘讗讙 谞讙专诐 诪砖讜专讛 讗讞转 诇讗 谞讻讜谞讛 讘拽讜讘抓 拽讜谞驻讬讙讜专爪讬讛, 讛讙讜专诪讬诐 讛诪注专讻转讬讬诐 讛讗诪讬转讬讬诐 诇转拽诇讛 讛讬讜 专讘讬诐: 1. 拽讘爪讬 讛拽讜谞驻讬讙讜专爪讬讛 诇讗 谞砖诪专讜 讘转讜讱 Source Control 讻诪讜 讛拽讜讚, 讜诇讻谉 拽砖讛 讛讬讛 诇讚注转 诪讬 砖讬谞讛 诪讛 讜诪转讬 讘拽讜讘抓. 2. 诪转讻谞转讬诐 讛砖讗讬专讜 拽讜讚 砖诇讗 爪专讬讻讬诐 讘讛注专讛, 诪讛 砖讙专诐 诇讛砖讗专转 拽讜讚 砖诇讗 注讜讘讚 (讗驻讬诇讜 砖讛讬讛 讘讛注专讛) 讘转讜讱 讛拽讜讘抓 讜讘诪拽讜诐 讝诪讬谉. 3. 讛讗驻专讜拽住讬 诇讗 讛转诇讜谞谉 讘砖讜诐 诪拽讜诐 (砖讛爪诇讞转讬 诇诪爪讜讗) 注诇 讝讛 砖讛讜讗 讝讜专拽 讘拽砖讛 讻讬 讛讜讗 诇讗 诪爪诇讬讞 诇讛讙讬注 诇 Unix Socket. 诪讚讬谞讬讜转 诇讜讙讬诐 讟讜讘讛 讬讜转专 讗讜诇讬 讛讬转讛 诪讗驻砖专转 诇谞讜 诇专讗讜转 讗转 讛转拽诇讛 讘讝诪谉 讗诪转 讜诇讞住讜讱 讝诪谉 讞讬驻讜砖.

ToCode
1 419
# 诪讬讚注 讗诪讬谉 讘砖讘讬诇 诇拽讘诇 讛讞诇讟讜转 讞讻诪讜转 爪专讬讱 诇讛转讘住住 注诇 谞转讜谞讬诐 讗诪讬谞讬诐. 讛讘注讬讛 讛讬讗 砖讘讻诇 转讞讜诪讬 讛讞讬讬诐 讜讙诐 讘诪注专讻讜转 转讜讻谞讛 谞转讜谞讬诐 讟讜讘讬诐 讝讛 讛讚讘专 砖讛讻讬 拽砖讛 诇诪爪讜讗. 谞谞讬讞 砖讛注诇讬转诐 讙讬专住讛 讞讚砖讛 讜注讻砖讬讜 诇拽讜讞讜转 诪转拽砖专讬诐 诇讛转诇讜谞谉 砖讻诇讜诐 诇讗 注讜讘讚. 讗谞讞谞讜 专讜爪讬诐 诇讚注转: 1. 诪讛 讘讚讬讜拽 诇讗 注讜讘讚 诇讛诐? 2. 讛讞诇 诪讗讬讝讜 讙讬专住讛 砖诇 讛拽讜讚 讛讚讘专 砖讛诐 诪谞住讬诐 诇讗 注讘讚? 3. 讛讗诐 讬砖 讛讜讚注转 砖讙讬讗讛 讘讗讞讚 讛诇讜讙讬诐? 4. 讛讗诐 诪砖讛讜 (讞讜抓 诪讛拽讜讚) 讛砖转谞讛 注诇 讛砖专转? 5. 诪讛 讛诇拽讜讞 专讜讗讛 讗爪诇讜 注诇 讛诪讻讜谞讛? 6. 讛讗诐 讬砖 讛讜讚注讜转 砖讙讬讗讛 讘 Browser Console 讗爪诇 讛诇拽讜讞? 讬砖 讛讬讜诐 讗讬谞住讜祝 讻诇讬诐 砖讗讜住驻讬诐 讗转 讛诪讬讚注 讜诪讗驻砖专讬诐 讙讬砖讛 诪讛讬专讛 讗诇讬讜 讻砖爪专讬讱 讗讜转讜. 讗诐 讗转诐 诇讗 注讻砖讬讜 讘转讜讱 讘注讬讬转 驻专讜讚拽砖谉, 砖讜讜讛 诇谞爪诇 讗转 讛讝诪谉 讜诇讛转拽讬谉 讗转 讛讻诇讬诐 砖讬讗驻砖专讜 诇讻诐 诇讛转讙讘专 注诇 讛转拽诇讛 讻砖讝讜 转讙讬注.

ToCode
1 419
# 讛诪专讞拽 讘讬谉 砖讬驻讜爪谞讬拽 诇诪讛谞讚住转 讘转讜专 诪转讻谞转讬诐 讗谞讞谞讜 讘讟讜讞讬诐 砖讬砖 诇谞讜 讻讞-注诇 诇驻转讜专 讘注讬讜转 讘诇讬 诇诇诪讜讚 注讚 讛住讜祝 讗转 讻诇 讛讟讻谞讜诇讜讙讬讜转 砖诪注讜专讘讜转 讘住讬驻讜专. 讗谞讬 讞讜砖讘 砖讙讚诇谞讜 诇转讜讱 讝讛 讻讬 讘讗诪转 讛讬讜诐 讛注讜诇诐 讛讟讻谞讜诇讜讙讬 讛讜讗 讻诇 讻讱 诪讜专讻讘 讜讬砖 转诪讬讚 注讜讚 讚讘专讬诐 讬讜转专 讘住讬住讬讬诐 诇讛讻讬专, 砖诪诪讬诇讗 诪讛 砖诇讗 转注砖讛 讗转讛 讛讜诇讱 诇讛转诪讜讚讚 注诐 讘注讬讜转 讘转谞讗讬 讗讬 讜讜讚讗讜转. 讻讱 诪转讻谞转 Mathlab 砖拽讬讘诇 诪砖讬诪讛 诇转拽谉 拽讜讚 拽爪专 讘 NumPy 诇讗 讬注爪讜专 诇诇诪讜讚 驻讬讬转讜谉 诪讗驻住 诇驻谞讬 砖谞讬讙砖 诇诪砖讬诪讛. 讛诪讞砖讘讛 砖诇谞讜 讛讬讗 "讗诐 谞转谞讜 诇讬 讗转 讛诪砖讬诪讛 讛讝讗转 讝讛 讘讟讞 讘讙诇诇 砖讬砖 诇讬 讻讜讞讜转 注诇 砖讬讗驻砖专讜 诇讬 诇诇诪讜讚 拽爪转 谞讗诪驻讬讬 讜诇驻转讜专 讗讜转讛, 讘诇讬 诇砖讘转 注讻砖讬讜 讞讜讚砖 诇诇诪讜讚 驻讬讬转讜谉". 讗讝 讗谞讬 谞讬讙砖讬诐 诇驻转讜专 讗转 讛讘注讬讛 讗讞专讬 砖拽专讗转讬 拽爪转 讘专砖转 讗讜 注砖讬转讬 讟讜讟讜专讬讗诇 拽讟谉 注诇 谞讗诪驻讬讬 讜讘讗诪转 讘讚专讱 讻诇诇 讙诐 诪爪诇讬讞 诇讻转讜讘 拽爪转 拽讜讚 砖谞专讗讛 讘讻讬讜讜谉 讛谞讻讜谉 讜讗讝 讗谞讬 谞转拽注. 讛转拽讬注讛 驻讛 讛讬讗 诇讙诪专讬 爪驻讜讬讛 讻讬 讝讛 诪讛 砖拽讜专讛 讻砖诪谞住讬诐 诇讻转讜讘 谞讗诪驻讬讬 讘诇讬 诇讚注转 驻讬讬转讜谉, 讗讘诇 讘转讜专 诪转讻谞转 注诐 讻讜讞讜转-注诇 讗谞讬 诪讬讚 诪住驻专 诇注爪诪讬 砖转诪讬讚 讬砖 诪讻砖讜诇讬诐 讘讚专讱 讜讘讟讞 讬砖 驻讬转专讜谉 讘 Stack Overflow 讗讜 讘讗讬讝讛 拽讘讜爪转 驻讬讬住讘讜拽. 讜讻讻讛 诪转讞讬诇 讛诪住注 讛讚讬 诪转住讻诇 讘诪讟专讛 诇驻转讜专 讗转 讛讘注讬讛 讘诇讬 诇注爪讜专 诇诇诪讜讚 诇注讜诪拽 讗转 讛谞讜砖讗 - 讻诇 诪讻砖讜诇 谞讜住祝 砖讜诇讞 讗讜转讬 诇讞讬驻讜砖 讗讞专讬 驻讬转专讜谉 谞讜住祝 讘专砖转 讘诇讬 诇讚注转 讻诪讛 诪讻砖讜诇讬诐 注讜讚 讬砖 注讚 砖讛拽讜讚 讬注讘讜讚. 讗诐 讛诪住诇讜诇 讛讝讛 讘住讜祝 讛讬讛 诪讜讘讬诇 诇讚专讱 诇诇讗 诪讜爪讗 诇讗 讛讬讬转讬 爪专讬讱 诇讻转讜讘 注诇讬讜 驻讜住讟. 讗谞讬 讞讜砖讘 砖讛讘注讬讛 讘诪住诇讜诇 讛讬讗 砖讝讛 诪住诇讜诇 砖注讜讘讚: 砖讬砖 诪住驻讬拽 拽讘讜爪讜转 驻讬讬住讘讜拽 讜砖讗诇讜转 讘 Stack Overflow 讻讚讬 砖诪转讻谞转讬诐 诪诪讜爪注讬诐 讬爪诇讬讞讜 诇驻转讜专 讗转 专讜讘 讛讘注讬讜转 讜讘讗诪转 诇讻转讜讘 拽讜讚 砖注讜讘讚. 讜讛拽住诐 讻讗谉 讝讛 砖讬砖 讙诐 诪砖讛讜 诪诪讻专 讘诪住诇讜诇 - 讻诇 驻注诐 驻讜转专讬诐 注讜讚 讗转讙专 拽讟谉 注讚 砖讛拽讜讚 注讜讘讚 讜讗讝 诪诪砖讬讻讬诐 诇诪砖讬诪讛 讛讘讗讛. 讗驻砖专 诇讛注讘讬专 讻讻讛 拽专讬讬专讛. 讗讘诇 讗谞讬 讻讜转讘 讗转 讛驻讜住讟 讻讚讬 诇讛驻谞讜转 讗转 讛诪讘讟 诇讚讘专 砖讗谞讞谞讜 诪驻住讬讚讬诐 讻砖讗谞讞谞讜 讛讜诇讻讬诐 砖讜讘 讜砖讜讘 讘诪住诇讜诇 讙讬讘讜专讬 讛注诇 砖诇谞讜 - 讜讛讚讘专 讛讝讛 讛讜讗 讛讬讚注 讛诪拽爪讜注讬 砖讘注讝专转讜 诪转讻谞转讬诐 讛讜驻讻讬诐 诇讗谞砖讬 诪拽爪讜注讬 讟讜讘讬诐 讬讜转专. 讻讬 转专讗讜 砖讬驻讜爪谞讬拽 诇讗 讛讜驻讱 诇诪讛谞讚住 专拽 讘讙诇诇 砖讛讜讗 诪转拽谉 注讜讚 谞讝讬诇讛. 讛诪专讞拽 讘讬谉 砖讬驻讜爪谞讬拽 诇诪讛谞讚住 注讜讘专 讘讛讬讻专讜转 注诐 注讜诇诐 转讜讻谉 转讬讗讜专讟讬 注砖讬专, 讛讬讻专讜转 砖诇讗 诪拽讘诇讬诐 诪讛讬讜诐 讬讜诐 讘驻讬转专讜谉 讘注讬讜转. 讚讜讜拽讗 讘讙诇诇 砖讬砖 诇讻诐 讻讜讞讜转 注诇, 砖讜讜讛 诇谞爪诇 讗讜转诐 讻讚讬 诇注砖讜转 讗转 讛讛转拽讚诪讜转 讛诪拽爪讜注讬转 砖讗转诐 讻诇 讻讱 爪专讬讻讬诐. 讻讬 讘住讜祝 讛诪转讻谞转讬诐 砖讗谞讞谞讜 爪专讬讻讬诐 讘转注砖讬讛 讛诐 诇讗 讗诇讛 砖驻讜转专讬诐 讻诪讛 砖讬讜转专 诪讛专 讟讗住拽讬诐 讘讙'讬专讛, 讗诇讗 讗诇讛 砖专讜讗讬诐 讗转 讛讘注讬讜转 诇注讜诪拽 讜诪讘讬谞讬诐 讗转 讛讬转专讜谞讜转 讜讛讞住专讜谞讜转 砖诇 讻诇 驻讬转专讜谉 讻讚讬 诇讘讞讜专 讗转 讛驻讬转专讜谉 讛讟讜讘 讘讬讜转专.

ToCode
1 419
# 砖诇讘讬诐 讘讛转诪讜讚讚讜转 注诐 讘注讬讜转 讻砖讗谞讞谞讜 谞转拽诇讬诐 讘讘注讬讛 讘转讜讻谞讛 爪驻讜讬讬诐 诇谞讜 讗专讘注讛 砖诇讘讬诐 讘讛转诪讜讚讚讜转: 1. 诇砖讬诐 诇讘 砖讬砖 讘注讬讛. 2. 诇诪爪讜讗 诪诇讗 驻讬转专讜谞讜转 砖诇讗 注讜讘讚讬诐. 3. 诇诪爪讜讗 驻讬转专讜谉 砖注讜讘讚. 4. 诇讞驻讜专 讘讘注讬讛, 诇讛讘讬谉 讗讜转讛 诇注讜诪拽 讜诇诪爪讜讗 注讜讚 驻讬转专讜谞讜转 砖注讜讘讚讬诐 (讜讘讚专讱 诇讛讘讬谉 诇诪讛 讛驻讬转专讜谞讜转 砖诇讗 注讘讚讜 讘讗诪转 诇讗 注讜讘讚讬诐). 5. 诇讛住讘讬专 讗转 诪讛 砖讙讬诇讬转诐 诇讗讚诐 讗讞专 (讗讜 诇讻转讜讘 诇注爪诪讻诐). 讘砖讘讬诇 砖诇讘讬诐 1-3 讗转诐 诇讗 爪专讬讻讬诐 讗讜转讬. 诇讗 诪砖谞讛 讗讬驻讛 讗转诐 注讜讘讚讬诐 讗诐 讗转诐 讻讜转讘讬诐 拽讜讚 讻谞专讗讛 讛讬讜 诇讻诐 讟注讜讬讜转, 讻谞专讗讛 砖谞讬住讬转诐 驻讬转专讜谞讜转 砖诇讗 注讘讚讜 讜讗谞讬 诪拽讜讜讛 砖讘住讜祝 讙诐 诪爪讗转诐 讗讬讝砖讛讜 驻讬转专讜谉 砖注讜讘讚. 讗诇讛 讛砖诇讘讬诐 讛专讘讬注讬 讜讛讞诪讬砖讬 讛诪讛讜讜讬诐 讗转 讛诪驻转讞 诇讛转驻转讞讜转 讛诪拽爪讜注讬转 砖诇谞讜. 讜讻谉, 砖诇讘讬诐 讗诇讛 讛诐 讘讚讬讜拽 讛住讬讘讛 砖讗谞讞谞讜 诇讗 讗讜讛讘讬诐 诇讛注转讬拽 驻讬转专讜谞讜转 诪 Stack Overflow. 讛讘谞讛 讗诪讬转讬转 砖诇 讛讘注讬讛 讛讬讗 讛讚专讱 讛讬讞讬讚讛 诇讛讘讟讬讞 砖讗讜转讛 讘注讬讛 诇讗 转讞讝讜专 注诇 注爪诪讛 讘爪讜专讜转 讞讚砖讜转 讘注转讬讚.

ToCode
1 419
讘谞讬讙讜讚 诇讬专讜砖讛, 砖讬转讜祝 拽讜讚 讘讗诪爪注讜转 Decorators 讘讗讜驻谉 讝讛 诪注讜讚讚 讗讜转谞讜 诇讛讚讘讬拽 诇转讜讱 讛诪讞诇拽讛 讛转谞讛讙讜讬讜转 诪住讜讙讬诐 砖讜谞讬诐, 诪讛 砖拽爪转 诪讝讻讬专 转讘谞讬转 砖诇 Mixins. 讘爪讚 讛讞住专讜谞讜转 诪讚讜讘专 讘诪讬诪讜砖 诪住讜讘讱 讬讜转专 讜诇讻谉 拽砖讛 讬讜转专 诇转讞讝讜拽讛.

ToCode
1 419
# 砖讬转讜祝 拽讜讚 讘讬谉 诪讞诇拽讜转 Python 讘讗诪爪注讜转 Decorators 讻讜诇诐 讛讬讜诐 讬讜讚注讬诐 诇讚拽诇诐 讗讬讱 讻砖讬砖 诇谞讜 诪讞诇拽讜转 注诐 拽讜讚 诪砖讜转祝 讗驻砖专 诇讛砖转诪砖 讘讬专讜砖讛 讻讚讬 诇讻转讜讘 讗转 讛拽讜讚 讛讻驻讜诇 专拽 驻注诐 讗讞转, 讗讘诇 诪讛 拽讜专讛 讻砖讛讚讘专 砖讗谞讞谞讜 专讜爪讬诐 诇砖转祝 讛讜讗 拽爪转 讬讜转专 诪住讜讘讱 诪驻讜谞拽爪讬讜转 讜诪讬讚注? 诪讛 拽讜专讛 讗诐 讻诇 诪讞诇拽讛 诪砖转驻转 讗转 讛拽讜讚 讛讝讛 讘爪讜专讛 拽爪转 讗讞专转? 讘驻讜住讟 讝讛 谞专讗讛 讚讜讙诪讛 讘讛 讬专讜砖讛 诇讗 注讜讘讚转 讻诇 讻讱 讟讜讘, 讜讘诪拽讜诪讛 谞专讗讛 驻讬转专讜谉 讗讞专 诇砖讬转讜祝 拽讜讚 讘讬谉 诪讞诇拽讜转 讘讗诪爪注讜转 Decorators. ## 诪讛 讗谞讞谞讜 讘讜谞讬诐 谞谞讬讞 砖讗谞讞谞讜 专讜爪讬诐 诇讘谞讜转 诪砖讞拽 砖讬砖 讘讜 讻讚讜专 拽讜驻抓 讜诪诇讘谉 砖爪专讬讱 诇转驻讜住 讗转 讛讻讚讜专 讛讝讛. 讗驻砖专 诇讚诪讬讬谉 砖讻诇 讗讞转 诪讛爪讜专讜转 讘诪注专讻转 转讬讜爪讙 讘讗诪爪注讜转 诪讞诇拽讛 讜诇讻诇 爪讜专讛 讬砖 诪讬拽讜诐 讜诪讛讬专讜转. 讘拽讜讚 驻讬讬转讜谉 (注诐 pyxel 讘砖讘讬诇 讛爪讬讜专讬诐) 讛拽讜讚 谞专讗讛 讻讱:
@dataclass
class Ball:
    x: int = 0
    vx: int = 2
    y: int = 20
    
    color: int = 2
    radius: int = 5

    def draw(self):
        pyxel.circ(self.x, self.y, self.radius, self.color)

    def update(self):
        self.x += self.vx


@dataclass
class Rect:
    x: int = 0
    vx: int = 2
    y: int = 0
    color: int = 5

    def draw(self):
        pyxel.rect(self.x, self.y, 60, 20, self.color)

    def update(self):
        self.x += self.vx
讘转讜讻谞讬转 注爪诪讛 讗驻砖专 诇讬爪讜专 讻讚讜专讬诐 讜诪拽诇讜转 讜讗驻讬诇讜 诇讛讝讬讝 讗讜转诐 (讻专讙注 驻砖讜讟 讻讜诇诐 讝讝讬诐 讬诪讬谞讛) 注诐 拽讜讚 砖谞专讗讛 讻讱:
shapes = [Ball(x=x, y=10) for x in range(0, 100, 30)] + [Rect(x=0, y=100)]


def draw():
    pyxel.cls(0)
    for shape in shapes:
        shape.draw()


def update():
    for shape in shapes:
        shape.update()

pyxel.init(160, 120)
pyxel.run(update, draw)
讛拽讜讚 注讜讘讚 讗讘诇 拽诇 诇专讗讜转 砖讬砖 诇谞讜 讻驻诇 拽讜讚 讘讬谉 砖转讬 讛诪讞诇拽讜转: 1. 讘砖转讬 讛诪讞诇拽讜转 讬砖 诪砖转谞讬诐 诇讬讬爪讜讙 讛诪讬拽讜诐 注诇 爪讬专 x 讜讛诪讛讬专讜转 注诇 爪讬专 x 2. 讘砖转讬 讛诪讞诇拽讜转 讬砖 驻讜谞拽爪讬讬转 update 砖诪注讚讻谞转 讗转 讛诪讬拽讜诐 注诇 爪讬专 x 诇驻讬 讛诪讛讬专讜转 讗驻砖专 讙诐 诇讚诪讬讬谉 砖讘注转讬讚 谞爪讟专讱 诇讛讝讬讝 讗转 讛讻讚讜专讬诐 讙诐 注诇 爪讬专 y, 讜讗讜诇讬 谞专爪讛 诪砖转谞讛 谞驻专讚 注讘讜专 讛诪讛讬专讜转 讘爪讬专 y. 讗讜诇讬 讗驻砖专 诇讚诪讬讬谉 诪砖讞拽 转诇转 诪讬诪讚讬 注诐 诪讬拽讜诐 讜诪讛讬专讜转 注诇 爪讬专 z. 讜讝讛 诪讘讬讗 讗讜转谞讜 诇讗转讙专 - 讗讬讱 讗驻砖专 诇砖转祝 讘爪讜专讛 拽诇讛 讗转 讛拽讜讚 砖诪讟驻诇 讘诪讬拽讜诐 讜讘诪讛讬专讜转 注诇 爪讬专 诪住讜讬诐, 讻讗砖专 讻诇 爪讜专讛 转讜讻诇 诇讛讙讚讬专 诇注爪诪讛 注诇 讗讬讝讛 爪讬专讬诐 讛讬讗 讬讻讜诇讛 诇讝讜讝? ## 讛驻讬转专讜谉: Decorators 讻讬讜讜谉 讗讞讚 诇驻讬转专讜谉 讬讛讬讛 诇讛讙讚讬专 讗转 讻诇 讛爪讬专讬诐 讛讗驻砖专讬讬诐 讘诪讞诇拽转-讗讘 讘砖诐 Shape. 讗谞讬 诪砖讗讬专 诇讻诐 讗转 讻转讬讘转 讛驻讬转专讜谉 讛讝讛 讘转讜专 转专讙讬诇, 讗讘诇 讗讙讬讚 专拽 砖讗谞讬 诇讗 讞讜砖讘 砖讝讛 驻讬转专讜谉 诪住驻讬拽 讟讜讘 讘诪拽专讛 讛讻诇诇讬. 讻讬 诇讗 讻诇 讛爪讜专讜转 爪专讬讻讜转 讗转 讛诪砖转谞讬诐 诇讻诇 讛爪讬专讬诐. 讻讬讜讜谉 讬讜转专 诪注谞讬讬谉 讛讜讗 砖讬诪讜砖 讘 Decorators: 讗诐 讗谞讬 讬讻讜诇 诇讛讜住讬祝 讘爪讜专讛 讚讬谞诪讬转 讗转 讛诪砖转谞讬诐 讛诪转讗讬诪讬诐 诇爪讬专 诪住讜讬诐, 讜诇注讚讻谉 讗转 讛驻讜谞拽爪讬讛 update 讜诇讛讜住讬祝 诇讛 讗转 讛转谞讜注讛 讘讗讜转讜 讻讬讜讜谉, 讗讜讻诇 诇讬讬爪专 Decorator 砖讬讜住讬祝 讗转 讛诪砖转谞讬诐 讜讬注讚讻谉 讗转 update 注诇 讛爪讬专讬诐 砖讗谞讬 爪专讬讱. 拽讜讚? 讘专讜专. 砖讬诪讜 诇讘 诇驻讜谞拽爪讬讛 讛讘讗讛:
def add_axis(axis, initial_value=0, initial_speed=2):
    def class_wrapper(cls):
        cls.__annotations__[axis] = int
        cls.__annotations__['v' + axis] = int
        setattr(cls, axis, initial_value)
        setattr(cls, 'v' + axis, initial_speed)
        original_update = getattr(cls, 'update')

        def update(self):
            original_update(self)
            setattr(self, axis, getattr(self, axis) + getattr(self, 'v' + axis))

        setattr(cls, 'update', update)
            
        return cls

    return class_wrapper
讛驻讜谞拽爪讬讛 诪拽讘诇转 诪讞诇拽讛 讗讞专转 讜诪注讚讻谞转 讗转 砖讚讛 __annotations__ 砖诇讛 注诐 讛诪砖转谞讬诐 讛诪转讗讬诪讬诐 诇爪讬专 讛讞讚砖 砖讗谞讬 讬讜爪专, 讜讙诐 讬讜爪专转 注专讻讬 讘专讬专转 诪讞讚诇 诇诪砖转谞讬诐 讘爪讬专 讝讛. 讗诐 axis 讬讛讬讛 x 谞拽讘诇 讗转 讛诪砖转谞讬诐 x 讜-vx. 讗诐 axis 讬讛讬讛 y 谞拽讘诇 讗转 讛诪砖转谞讬诐 y 讜 vy, 讜讻讱 诇讻诇 爪讬专 砖讗驻砖专 诇讚诪讬讬谉. 讘砖讘讬诇 诇讛驻注讬诇 讗转 讛驻讜谞拽爪讬讛 讗谞讬 诪砖转诪砖 讘讻转讬讘 讛 Decorators 注诇 讛诪讞诇拽讛, 讜注诇 讛讚专讱 讙诐 诪讜住讬祝 诇讻讚讜专讬诐 转谞讜注讛 注诇 爪讬专 y:
@dataclass
@add_axis('x', 0, 2)
@add_axis('y', 20, 1)
class Ball:
    color: int = 2
    radius: int = 5

    def draw(self):
        pyxel.circ(self.x, self.y, self.radius, self.color)

    def update(self):
        pass


@dataclass
@add_axis('x', 0, 2)
@add_axis('y', 20, 0)
class Rect:
    color: int = 5

    def draw(self):
        pyxel.rect(self.x, self.y, 60, 20, self.color)

    def update(self):
        pass

ToCode
1 419
诇讚讜讙诪讛 谞谞讬讞 砖讬砖 诇讬 诪注专讻转 驻讬专住讜诐 讘讛 诪砖转诪砖讬诐 讬讻讜诇讬诐 诇讬爪讜专 驻讬专住讜诪讜转 砖讬讜爪讙讜 讘讻诇 诪讬谞讬 讗转专讬诐. 讗谞讬 专讜爪讛 诇讜讜讚讗 砖讬砖 诇讬 驻专讟讬 讻专讟讬住 讗砖专讗讬 砖诇 讛诪砖转诪砖 诇驻谞讬 砖讗谞讬 谞讜转谉 诇讜 诇讛注诇讜转 驻讬专住讜诪转 诇讗讜讜讬专. 讗驻砖专 诇讚诪讬讬谉 讜讜诇讬讚爪讬讛 讻诇诇讬转 注诇 "驻讬专住讜诪转" 砖诪讜讜讚讗转 砖讬砖 诇讬 讘诪注专讻转 讗转 驻专讟讬 讛讗砖专讗讬 砖诇 讛诪砖转诪砖 诇驻谞讬 砖讗谞讬 谞讜转谉 诇讜 诇砖诪讜专 讗讜讘讬拽讟 驻讬专住讜诪转, 讗讘诇 讝讗转 转讛讬讛 讞讜讜讬讛 讚讬 讙专讜注讛 诇诪砖转诪砖. 讛专讘讛 讬讜转专 讛讙讬讜谞讬 诇转转 诇诪砖转诪砖 诇讘谞讜转 讜诇砖诪讜专 驻讬专住讜诪讜转, 讜诇讬爪讜专 诪住讱 讬讬注讜讚讬 注讘讜专 "讛注诇讗讛 诇讗讜讜讬专" 砖诇 讛驻讬专住讜诪讜转, 讜讘讗讜转讜 诪住讱 诇讚讗讜讙 诇拽讘诇转 讗诪爪注讬 转砖诇讜诐 讗诐 讛讜讗 诇讗 砖诪讜专 讗爪诇谞讜. 讘讙讚讜诇 讻砖讗谞讞谞讜 专讜讗讬诐 讗转 讛驻拽讜讚讛:
errors.add(:base, '...')
讘转讜专 拽讜讚 砖诇 Active Record 讝讛 讻诪注讟 转诪讬讚 谞拽讜讚转 驻转讬讞讛 讟讜讘讛 诇 Refactoring. 讬砖 诇讻诐 讟讬驻讬诐 谞讜住驻讬诐 注诇 Active Record Validations? 讗砖诪讞 诇砖诪讜注, 诪讜讝诪谞讬诐 诇砖转祝 讘转讙讜讘讜转.

ToCode
1 419
 => false
讛讚专讱 诇讛转诪讜讚讚 注诐 诪住驻专 诪拽讜专讜转 注讚讻讜谉 讘专讬讬诇住 讛讬讗 诇讬讬爪专 诪住驻专 Validation Contexts. 讻诇 Validation Context 诪讬讬爪讙 讗转 讛讟讜驻住 讗讜 讛诪住讱 讘讜 讗谞讞谞讜 专讜爪讬诐 诇注讚讻谉 讗转 讛讛讜讚注讛 讘爪讜专讛 诪住讜讬诪转, 讜讛讜讜诇讬讚爪讬讜转 砖讘讜 讬转讗讬诪讜 诇讗驻砖专讜讬讜转 讘讗讜转讜 讛诪住讱. 讘讞讝专讛 诇讛讜讚注讛 讗驻砖专 诇注讚讻谉 讗转 讛拽讜讚 讘爪讜专讛 讛讘讗讛:
class Message < ApplicationRecord
  validates :from, presence: true, on: :message_form
  validates :to, presence: true, on: :message_form
  validates :title, length: { minimum: 5 }, on: :message_form
  validates :body, presence: true, on: :message_form
end
讘注转 砖诪讬专转 讛讜讚注讛 讗谞讞谞讜 谞注讘讬专 注讻砖讬讜 讗转 讛拽讜谞讟拽住讟 讛诪转讗讬诐 讻讚讬 砖专讬讬诇住 讬讚注 讗讬讝讛 讜讜诇讬讚爪讬讜转 诇讛驻注讬诇:
m = Message.first
m.important = true
m.save(context: :message_index)
 => true
讻专讙注 驻讜谞拽爪讬讬转 update 砖诇 专讬讬诇住 诇讗 讬讜讚注转 诇注讘讜讚 注诐 Custom Validation Context 讜诇讻谉 讻讚讬 诇注讘讜讚 讗讬转诐 讘讚专讱 讻诇诇 谞专爪讛 诇讛讜住讬祝 驻讜谞拽爪讬讛 诪砖诇谞讜 诇讻诇 讛 Active Records 讘讬讬砖讜诐:
class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true

  def update_attibutes_with_context(attributes, *contexts)
    with_transaction_returning_status do
      assign_attributes(attributes)
      save(context: contexts)
    end
  end
end
讜诇住讬讜诐 讘 Controller 谞爪讟专讱 诇讛讜住讬祝 讗转 讛 Context 讛诪转讗讬诐 讘讻诇 驻注讜诇讛:
class MessagesController < ApplicationController
  before_action :set_message, only: [:show, :edit, :update, :destroy, :toggle_important]

  # GET /messages
  # GET /messages.json
  def index
    @messages = Message.all
  end

  # GET /messages/1
  # GET /messages/1.json
  def show
  end

  # GET /messages/new
  def new
    @message = Message.new
  end

  # GET /messages/1/edit
  def edit
  end

  def toggle_important
    @message.important = !@message.important
    @message.save(context: :messages_index)
  end

  # POST /messages
  # POST /messages.json
  def create
    @message = Message.new(message_params)

    respond_to do |format|
      if @message.save(context: :message_form)
        format.html { redirect_to @message, notice: 'Message was successfully created.' }
        format.json { render :show, status: :created, location: @message }
      else
        format.html { render :new }
        format.json { render json: @message.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /messages/1
  # PATCH/PUT /messages/1.json
  def update
    respond_to do |format|
      if @message.update_attributes_with_context(message_params, :message_form)
        format.html { redirect_to @message, notice: 'Message was successfully updated.' }
        format.json { render :show, status: :ok, location: @message }
      else
        format.html { render :edit }
        format.json { render json: @message.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /messages/1
  # DELETE /messages/1.json
  def destroy
    @message.destroy
    respond_to do |format|
      format.html { redirect_to messages_url, notice: 'Message was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_message
      @message = Message.find(params[:id])
    end

    # Only allow a list of trusted parameters through.
    def message_params
      params.require(:message).permit(:from, :to, :title, :body)
    end
end
## 讗驻砖专 诇讬爪讜专 讜讜诇讬讚爪讬讛 讻诇诇讬转 (诇诪专讜转 砖讝讛 诪讘诇讘诇 讗转 讛诪砖转诪砖讬诐) 专讬讬诇住 诪讗驻砖专 诇谞讜 诇讬爪讜专 讜讜诇讬讚爪讬讛 "讻诇诇讬转" 注诇 讗讜讘讬拽讟 砖讛转讜爪讗讛 砖诇讛 转讜爪讙 讘专砖讬诪转 讛讜讚注讜转 讛砖讙讬讗讛 砖诇 讛讟讜驻住 讗讘诇 诇讗 注讘讜专 砖讚讛 诪住讜讬诐. 讻诪注讟 转诪讬讚 讻砖讗转诐 讘讗讬诐 诇讻转讜讘 讜讜诇讬讚爪讬讛 讻诇诇讬转 讻讝讜 砖讜讜讛 诇讛砖拽讬注 注讜讚 讻诪讛 讚拽讜转 砖诇 诪讞砖讘讛 讜诇诪爪讜讗 讚专讱 讟讜讘讛 讬讜转专 诇讘讬爪讜注 讛诪砖讬诪讛.

ToCode
1 419
专讬讬诇住 讛讜讗 讗讜诪谞诐 诪讛讬专 讗讘诇 讙诐 砖诇讬讞转 讛讜讚注讛 诇砖专转 讛诪讛讬专 讘注讜诇诐 转讬拽讞 讬讜转专 讝诪谉 诪讜讜诇讬讚爪讬讛 砖专爪讛 讗爪诇 讛诇拽讜讞 讘诇讬 诇讚讘专 注诐 讛砖专转. 讻诪注讟 转诪讬讚 讘讻诇 诪拽讜诐 砖讬砖 讜讜诇讬讚爪讬讛 讘 Active Record 讻讚讗讬 诇讛讜住讬祝 讙诐 讜讜诇讬讚爪讬讛 诪拽讘讬诇讛 讘讟讜驻住 (讗谞讬 讗讜诪专 讻诪注讟 讻讬 讝讛 诇讗 转诪讬讚 讗驻砖专讬 - 诇讚讜讙诪讛 讜讬讚讜讗 砖注专讱 诪住讜讬诐 讛讜讗 讬讬讞讜讚讬 讘诪注专讻转 讝讛 诪砖讛讜 砖讗驻砖专 诇注砖讜转 专拽 讘爪讚 砖专转). 讘讚讜讙诪讛 砖诇谞讜 讗谞讬 讬讻讜诇 诇注讚讻谉 讗转 讛讟讜驻住 注诐 讛拽讜讚 讛讘讗 讜讻讱 诇讛专讜讜讬讞 讙诐 讜讜诇讬讚爪讬讛 诇驻谞讬 砖诇讬讞转 讛讛讜讚注讛 诇砖专转 (讻讚讬 诇拽讘诇 讞讜讜讬转 诪砖转诪砖 讟讜讘讛 讬讜转专), 讜讙诐 讜讜诇讬讚爪讬讛 讘爪讚 讛砖专转 (讘砖讘讬诇 讗讘讟讞转 诪讬讚注 讜讘砖讘讬诇 驻专讟讬诐 砖讛诇拽讜讞 诇讗 讬讜讚注 注讚讬讬谉):
<%= form_with(model: message, local: true) do |form| %>
  <% if message.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(message.errors.count, "error") %> prohibited this message from being saved:</h2>

      <ul>
        <% message.errors.full_messages.each do |message| %>
          <li><%= message %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= form.label :from %>
    <%= form.text_field :from, required: true %>
  </div>

  <div class="field">
    <%= form.label :to %>
    <%= form.text_field :to, required: true %>
  </div>

  <div class="field">
    <%= form.label :title %>
    <%= form.text_field :title, required: true, minlength: 6 %>
  </div>

  <div class="field">
    <%= form.label :body %>
    <%= form.text_area :body, required: true %>
  </div>

  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>

住驻专讬讛 讘砖诐 client_side_validations 诪转专讙诪转 讘爪讜专讛 讗讜讟讜诪讟讬转 讗转 讛 Active Record Validations 诇讜讜诇讬讚爪讬讜转 讘爪讚 诇拽讜讞 讘讗诪爪注讜转 JavaScript 讜诇驻注诪讬诐 讻讚讗讬 诇讛砖转诪砖 讘讛. ## 讜讜诇讬讚爪讬讛 讗讬谞讛 讗讬谞讚拽住 专注讬讜谉 砖谞讬 砖讞砖讜讘 诇讝讻讜专 讛讜讗 砖讛诪讟专讛 砖诇 讜讜诇讬讚爪讬讛 讛讬讗 诇讛爪讬讙 讛讜讚注转 砖讙讬讗讛 讬驻讛 诇诪砖转诪砖 讻砖讗讜转讜 诪砖转诪砖 诪谞住讛 诇讛拽诇讬讚 谞转讜谞讬诐 诇讗 谞讻讜谞讬诐 讘讟讜驻住. 讜讜诇讬讚爪讬讛 讘 Active Record 诇讗 转诪谞注 诪讛诪注专讻转 砖诇讻诐 诇砖诪讜专 诪讬讚注 砖讙讜讬 讗讜 砖诇讗 注讜讘专 讜讜诇讬讚爪讬讛 讜讬砖 讛诪讜谉 讚专讻讬诐 诇砖诪讜专 诪讬讚注 讜诇讚诇讙 注诇 讛讜讜诇讬讚爪讬讛. 讗诐 讞砖讜讘 诇讻诐 砖诪讬讚注 "诇讗 谞讻讜谉" 诇讗 讬讬讻谞住 诇讘住讬住 讛谞转讜谞讬诐 讛讚专讱 讛讬讞讬讚讛 诇讛讘讟讬讞 讗转 讝讛 讛讬讗 诇讬爪讜专 讗讬谞讚拽住 讗讜 Constraint 讘讘住讬住 讛谞转讜谞讬诐 注爪诪讜. 谞砖讬诐 诇讘 砖讘住讬住讬 谞转讜谞讬诐 诇讗 讬讜讚注讬诐 诇注砖讜转 讻诇 诪讛 砖讛砖专转 砖诇谞讜 讬讜讚注 诇注砖讜转, 讜讘专讜讘诐 讗讬谉 讚专讱 拽诇讛 诇讛讙讚讬专 诇讚讜讙诪讛 讗讜专讱 诪讬谞讬诪诇讬 诇诪讞专讜讝转 讘注诪讜讚讛. 讝讛 讗讜诪专 砖讘讛讞诇讟 讬讛讬讜 诪爪讘讬诐 讘讛诐 转讛讬讛 诇讻诐 讜讜诇讬讚爪讬讛 讗讘诇 讞诇拽 诪讛诪讬讚注 讘讘住讬住 讛谞转讜谞讬诐 诇讗 讬注讘讜专 讗讜转讛. 讘诪爪讘 讻讝讛 诪砖转诪砖 讬爪讟专讱 诇注讚讻谉 注专讻讬诐 讘讟讜驻住 讙诐 讗诐 讛讜讗 诇讗 砖讬谞讛 讗讜转诐 专拽 讘砖讘讬诇 诇砖诪讜专 讗转 讛诪讬讚注. 讘讚讜讙诪讛 砖诇谞讜, 讗谞讬 讬讻讜诇 诇讬爪讜专 诪转讜讱 Rails Console 讗讜讘讬拽讟 讛讜讚注讛 转讜讱 讚讬诇讜讙 注诇 讛讜讜诇讬讚爪讬讛:
m=Message.new(to: 'ynon')
m.save(validate: false)
讘讗驻诇讬拽爪讬讛 注爪诪讛 讗谞讬 讗专讗讛 讗转 讛讛讜讚注讛 讛讝讜 讘专砖讬诪转 讛讛讜讚注讜转 讜讗讜讻诇 诇讛讬讻谞住 诇讟讜驻住 注专讬讻讛 讻讚讬 诇注讚讻谉 讗讜转讛, 讗讘诇 讘转讜讱 讗讜转讜 讟讜驻住 讗谞讬 讗讛讬讛 讞讬讬讘 诇注讚讻谉 讗转 讛砖讚讜转 from, title 讜 body 讻讚讬 砖讗讜讻诇 诇砖诪讜专. ## 讛讬讜 讝讛讬专讬诐 讻砖讗转诐 诪讜住讬驻讬诐 讜讜诇讬讚爪讬讛 讞讚砖讛 诇诪讜讚诇 讗讬谉 讘注讬讛 诇讛讜住讬祝 讜讜诇讬讚爪讬讛 诇诪讜讚诇 砖讬砖 讘讜 讻讘专 谞转讜谞讬诐 (诇诪砖诇 诪讙讬专住讛 拽讜讚诪转 砖诇 讛讗驻诇讬拽爪讬讛) 讗讘诇 注诇讬讻诐 诇讛讬讜转 讝讛讬专讬诐 讜讗祝 驻注诐 诇讗 诇讛谞讬讞 砖讻诇 讛讜讜诇讬讚爪讬讜转 注讜讘专讜转 注诇 谞转讜谞讬诐 拽讬讬诪讬诐. 讻诇 讛讜住驻讛 砖诇 讜讜诇讬讚爪讬讛 爪专讬讻讛 诇讛转讞讬诇 诪诪讞砖讘讛 注诇 讟讜驻住 讜注诇 讛讜讚注讛 砖诪砖转诪砖 讬专讗讛 讻砖讛讜讗 诪诪诇讗 讗转 讛讟讜驻住. 讗诐 诪讜住讬驻讬诐 讜讜诇讬讚爪讬讛 注诇 谞转讜谞讬诐 拽讬讬诪讬诐 讬砖 诇讜讜讚讗 砖诪砖转诪砖 讬讻讜诇 诇驻转讜讞 讗转 讛讗讜讘讬拽讟 讘诪爪讘 注专讬讻讛 讜诇讛讜住讬祝 讗转 讛注专讻讬诐 讛讞住专讬诐 讻讚讬 诇注讘讜专 讜讜诇讬讚爪讬讛 (讗讞专转 讗讬 讗驻砖专 讬讛讬讛 诇砖诪讜专 讗讜 诇注讚讻谉 讗驻讬诇讜 砖讚讜转 讗讞专讬诐). ## 讗驻砖专 诇讛讙讘讬诇 讜讜诇讬讚爪讬讛 诇 Context 诪住讜讬诐 讛诪爪讘 讛讝讛 砖诇 讜讜诇讬讚爪讬讜转 讞讚砖讜转 讛讜驻讱 诪讘诇讘诇 讘诪讬讜讞讚 讻砖讬砖 诪住驻专 讚专讻讬诐 诇注讚讻谉 讗讜讘讬拽讟 讘诪注专讻转. 诇讚讜讙诪讛 讘诪注专讻转 讛讛讜讚注讜转 砖诇谞讜 讗驻砖专 诇讚诪讬讬谉 砖诇讻诇 讛讜讚注讛 讬讛讬讛 讻驻转讜专 注诐 讗讬讬拽讜谉 砖诇 讻讜讻讘 讘诪住讱 专砖讬诪转 讛讛讜讚注讜转 砖讬住诪谉 讗讜转讛 讘转讜专 讛讜讚注讛 "讞砖讜讘讛". 注讻砖讬讜 讬砖 诇谞讜 2 讚专讻讬诐 诇注讚讻谉 讻诇 讛讜讚注讛: 1. 讟讜驻住 讛注讚讻讜谉 讛专讙讬诇 砖诇 讛讜讚注讛 2. 诇讞讬爪讛 注诇 讻驻转讜专 "讻讜讻讘" 砖诪注讚讻谞转 专拽 讗转 砖讚讛 "important" 讘讛讜讚注讛, 砖讚讛 讞讚砖 砖讬爪专谞讜 讘砖讘讬诇 讛驻讬爪'专. 讗诐 讘讗诪转 谞诇讱 诇讘谞讜转 讗转 驻讬爪'专 讛讻讜讻讘讬诐 谞讙诇讛 砖讗谞讞谞讜 诇讗 讬讻讜诇讬诐 诇住诪谉 讘转讜专 "讞砖讜讘" 讗转 讛讛讜讚注讛 讛诇讗 讜讜诇讬讚讬转 砖讬爪专谞讜 讘住注讬祝 讛拽讜讚诐. 专讬讬诇住 讬讬讻砖诇 讘讟注谞讛 砖讛讜讗 诇讗 讬讻讜诇 诇注讚讻谉 讗转 讛讗讜讘讬拽讟 讻讬 讛讗讜讘讬拽讟 谞讻砖诇 讘讜讜诇讬讚爪讬讛, 诇诪专讜转 砖讗谞讞谞讜 注讜讘讚讬诐 诪转讜讱 诪诪砖拽 讗讞专 讘讜 讗讬 讗驻砖专 诇砖谞讜转 讗转 讛砖讚讜转 砖诇讗 注讘专讜 讜讜诇讬讚爪讬讛. 讗驻砖专 诇专讗讜转 讗转 讝讛 讗诐 谞专讬抓 讗转 讛拽讜讚 讛讘讗 诪转讜讱 讛拽讜谞住讜诇:
m = Message.first
m.important = true
m.save

ToCode
1 419
# 讟讬驻讬诐 诇砖讬诪讜砖 讟讜讘 讬讜转专 讘 Active Record Validations 讗讞讚 讛专注讬讜谞讜转 讛讬驻讬诐 讘专讬讬诇住, 讜讗讞讚 讛专注讬讜谞讜转 砖诇拽讞 诇讬 讛讻讬 讛专讘讛 讝诪谉 诇讛讘讬谉, 讛讜讗 讛 Active Record Validations. 讛住讬驻讜专 讘拽爪专讛 讛讜讗 砖诇驻注诪讬诐 讬砖 诇谞讜 讘讗驻诇讬拽爪讬讛 讟驻住讬诐 砖诪讟专转诐 诇讬爪讜专 讗讜 诇注讚讻谉 诪讬讚注 讘讘住讬住 讛谞转讜谞讬诐. 讛诪讬讚注 讘讘住讬住 讛谞转讜谞讬诐 讘专讬讬诇住 诪讬讜爪讙 注诇 讬讚讬 拽诇讗住 砖谞拽专讗 Active Record, 讜诇讻谉 讻砖爪专讬讱 诇注砖讜转 讜讜诇讬讚爪讬讛 注诇 讛诪讬讚注 讘讟驻住讬诐 讗讜转诐 Active Records 讬讛讬讜 讛诪拽讜诐 讛讗讬讚讗诇讬. 讘驻讜住讟 讝讛 讗专讗讛 讘拽爪专讛 讗讬讱 诇讛砖转诪砖 讘 Active Record Validations 讘讬讬砖讜诐 讜诇讗讞专 诪讻谉 讗诪砖讬讱 诇诪住驻专 讟讬驻讬诐 诇砖讬诪讜砖 谞讻讜谉 讘讛诐. ## 讗讬讱 讝讛 注讜讘讚 讘 Rails 讻诇 讟讘诇讛 讘讘住讬住 讛谞转讜谞讬诐 诪讬讜爪讙转 注诇 讬讚讬 诪讞诇拽讛 砖讬讜专砖转 诪 Active Record, 讜讻诇 讗讜讘讬拽讟 诪诪讞诇拽讛 讝讜 诪讬讬爪讙 砖讜专讛 讘讟讘诇讛. 讘讛讙讚专转 讛诪讞诇拽讛 讗谞讞谞讜 诇讗 爪专讬讻讬诐 诇讛讙讚讬专 讗转 讛注诪讜讚讜转 (专讬讬诇住 诪讝讛讛 讗讜转谉 讗讜讟讜诪讟讬转). 讛拽讜讚 讛讘讗 注砖讜讬 诇讛讬讜转 拽讜讚 砖诪讙讚讬专 讗转 讛讞讬讘讜专 讘讬谉 讗驻诇讬拽爪讬讬转 Rails 诇讟讘诇转 讛讛讜讚注讜转:
class Message < ApplicationRecord
end
讘讜讗讜 谞谞讬讞 砖讻诇 讛讜讚注讛 讻讜诇诇转 讗转 讛砖讚讜转 讛讘讗讬诐: 1. 砖诐 讛砖讜诇讞 2. 砖诐 讛谞诪注谉 3. 谞讜砖讗 讛讛讜讚注讛 4. 讙讜祝 讛讛讜讚注讛 5. 转讗专讬讱 讬爪讬专转 讛讛讜讚注讛 6. 转讗专讬讱 注讚讻讜谉 讗讞专讜谉 砖诇 讛讛讜讚注讛 拽讜讚 专讬讬诇住 砖讬讜爪专 讗转 讟讘诇转 讛讛讜讚注讜转 谞专讗讛 讻讱:
  create_table "messages", force: :cascade do |t|
    t.string "from"
    t.string "to"
    t.string "title"
    t.text "body"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end
讻诪讜 砖讛拽讜讚 讻转讜讘 讗讬谉 讜讜诇讬讚爪讬讜转 讻诇诇 注诇 讛砖讚讜转 讘讛讜讚注讛. 讗诐 谞讘谞讛 讟讜驻住 诇讬爪讬专转 讛讜讚注讛 讞讚砖讛, 诪砖转诪砖 讬讜讻诇 诇讛讝讬谉 讻诇 注专讱 讘讟讜驻住 讜讙诐 诇讛砖讗讬专 砖讚讜转 专讬拽讬诐. 讛 Active Record Validation 谞讜注讚 诇转转 讗转 讛转砖转讬转 砖诪讞讘专转 讘讬谉 讜讜诇讬讚爪讬讛 砖诇 讛砖讚讜转 诇讘讬谉 讛讟讜驻住 砖诪砖转诪砖 诪诪诇讗, 讜讝讛 注讜讘讚 讻讱: 1. 诪砖转诪砖 诪讝讬谉 诪讬讚注 讘讟讜驻住 讜讛诪讬讚注 诪讙讬注 诇砖专转 2. 讛砖专转 讬讜爪专 讗讜讘讬拽讟 Message 讜诪诪诇讗 讗讜转讜 讘诪讬讚注 砖讛诪砖转诪砖 讛拽诇讬讚 讘讟讜驻住 3. 讛砖专转 诪驻注讬诇 Validation 注诇 讛讗讜讘讬拽讟 砖谞讜爪专. 讗诐 讛讬讜 砖讙讬讗讜转, 讛转讜爪讗讛 砖诇 讛讜讜诇讬讚爪讬讛 讛讬讗 讛讜住驻转 砖讚讜转 诪讬讚注 诇讗讜讘讬拽讟 讘爪讚 讛砖专转 注诐 讛讜讚注讜转 讛砖讙讬讗讛 讛诪转讗讬诪讜转 诇驻讬 讛砖讚讜转 砖诇 讛讗讜讘讬拽讟. 4. 讛砖专转 讬讜爪专 HTML 讗讜 JSON 诪讗讜讘讬拽讟 讛 Message 砖谞讜爪专 (讝讛 注诐 讛砖讙讬讗讜转) 讜讛讜讚注讜转 讛砖讙讬讗讛 讛诪转讗讬诪讜转 诪讜爪讙讜转 讘讟讜驻住 讗讜 讘转讜讱 讗讜讘讬拽讟 讛 JSON. 诇专讬讬诇住 讬砖 讙诐 转砖转讬转 讚讬 讟讜讘讛 砖诪讞讘专转 讘讬谉 讟讜驻住 诇讘讬谉 讛砖讙讬讗讜转 讻讱 砖讘拽讜讚 讛 ERB 讗谞讞谞讜 爪专讬讻讬诐 讘住讱 讛讻诇 诇讻转讜讘 讗转 讛砖讚讜转 讘讟讜驻住 讘讗讜驻谉 讛讘讗:
<%= form_with(model: message, local: true) do |form| %>
  <% if message.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(message.errors.count, "error") %> prohibited this message from being saved:</h2>

      <ul>
        <% message.errors.full_messages.each do |message| %>
          <li><%= message %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= form.label :from %>
    <%= form.text_field :from %>
  </div>

  <div class="field">
    <%= form.label :to %>
    <%= form.text_field :to %>
  </div>

  <div class="field">
    <%= form.label :title %>
    <%= form.text_field :title %>
  </div>

  <div class="field">
    <%= form.label :body %>
    <%= form.text_area :body %>
  </div>

  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>
讜讘讗讜驻谉 讗讜讟讜诪讟讬 讛讞诇拽 讛注诇讬讜谉 讬转诪诇讗 讘讛讜讚注讜转 讛砖讙讬讗讛 讛诪转讗讬诪讜转 砖谞诇拽讞讜 讬砖讬专讜转 诪转讜讱 讛 Validation. 讘砖讘讬诇 讛讚讜讙诪讛 讗谞讬 诪讜住讬祝 讘拽讜讚 砖诇 message.rb 讗转 讛转讜讻谉 讛讘讗:
class Message < ApplicationRecord
  validates :from, presence: true
  validates :to, presence: true
  validates :title, length: { minimum: 5 }
  validates :body, presence: true
end
讛诪砖诪注讜转 砖诇 讛讜讜诇讬讚爪讬讛 讛讬讗 砖讘注转 讛讙砖转 讛讟讜驻住 转转讜讜住祝 Server Side Validation 注诇 讛诪讬讚注 讜讛讛讜讚注讛 转讬砖诪专 专拽 讗诐 讻诇 讛砖讚讜转 注讜诪讚讬诐 讘转谞讗讬诐 砖讛讙讚专转讬, 讻诇讜诪专: 1. 拽讬讬诐 注专讱 诇砖讚讛 from 2. 拽讬讬诐 注专讱 诇砖讚讛 to 3. 拽讬讬诐 注专讱 诇砖讚讛 title 讘讗讜专讱 诪讬谞讬诪诇讬 砖诇 5 转讜讜讬诐 4. 拽讬讬诐 注专讱 诇砖讚讛 body 讻诇 讗讞讚 诪讛砖讚讜转 砖诇讗 诪转讗讬诐 诇讜讜诇讬讚爪讬讛 讬讙专讜诐 诇讛爪讙转 讛讜讚注转 砖讙讬讗讛 讘专讗砖 讛讟讜驻住 讜讘谞讜住祝 诇讬爪讬专转 div 讞讚砖 讘转讜讱 讛 div 注诐 讛拽诇讗住 field 砖诇讜 讛拽诇讗住 field_with_errors, 诪讛 砖讬讗驻砖专 诇爪讘讜注 讗转 讛诪拽讜诐 讛专诇讜讜谞讟讬 讘讟讜驻住 讘讗讚讜诐. 讜注讻砖讬讜 砖讗谞讞谞讜 诪讘讬谞讬诐 讗转 讛住讬驻讜专 讛讝讛 讛谞讛 讻诪讛 讚讘专讬诐 砖讞砖讜讘 诇讝讻讜专 诇讙讘讬 讜讜诇讬讚爪讬讜转: ## 讛讜讜诇讬讚爪讬讜转 谞讘讚拽讜转 讘爪讚 砖专转 讜讗讬谞谉 诪讞诇讬驻讜转 Client Side Validations