ãããããããã¯ã©ãŠããµãŒãã¹ãããã€ããŒãååšããé²æ©ã«è¿œãã€ãããšãæãã§ããŸããã ãããŠåœŒã¯ãRails 4.2.8ããRails 5.0.2ã«ã¢ããã°ã¬ãŒãããããšã«ããŸããã ãããŠããããã©ã®ããã«ããããéäžã§èœã¡ãã®ããå éããŠé¡ã«åœãã£ãã®ããããããã©ããªçµéšãåŸãããã®ã-ç«ã®äžã§èªãã§ãã ããã
ã»ãšãã©ã®æ©èœãšåé¡ã¯æ±ºããŠçžäºã«é¢é£ããŠããªããããæççã«èª¬æããŸãã ãããã£ãŠãã€ãŸããªããã®ãç¥ãããŠãããã®ã«åºäŒã£ããã次ã®ãã€ã³ãã«é²ãã§ãã ãããããããããã£ãšé¢çœãã§ãããã
ã¹ããŒãªãŒã®ç®çïŒæ®éçãªé·ç§»ã¢ã«ãŽãªãºã ã¯ãããŸãããèŠã€ãã£ãæ
å ±ãšãGemfileã®ããŒãžã§ã³ã埮調æŽããã ãã§Rails 5ã«è¡ãããšãã§ããªãçç±ã«ã€ããŠã®ããŸããŸãªçšåºŠã®è©³çŽ°ãå
±æãããã ãã§ãã
æ¢åŸæŽ
å¹³åçãªã¢ããªã±ãŒã·ã§ã³ããããŸãïŒRuby 2.2.3ãæ°çŸã®å®ç³ã®å°Ÿãæã€3ã€ãã1500ã¢ã¯ã·ã§ã³ãpostgresãelasticãradishã äžè¬çã«ãç¹å¥ãªããšã¯äœããããŸããã ãã¹ãã90ïŒ
+ã§ã«ããŒãããŠããªãéãã ããã¯ãäžéšã®ææ°ã®ã¢ããªã±ãŒã·ã§ã³ã®ç¹åŸŽã§ã¯ãªãããã§ãã
æåããå§ãã
Rails 5.2ã¯éè¿ã«è¿«ã£ãŠããŸãããã¡ãžã£ãŒããŒãžã§ã³ã®æŽæ°ãæ¥ãã§ãã人ã¯ããŸããã ãããã£ãŠãã€ã³ã¿ãŒãããã«ã¯ã移è¡ã®æ©èœã«é¢ããæ
å ±ãå¿
èŠãªã»ã©å€ããããŸããã ããã«å€ããå°ãªããæçãªèšè¿°ããããŸã ã 5.0ããã³5.1ã®ãªãªãŒã¹ããããŸãïŒãšããã§ããŸã ããããã«ãŠã³ãããŠããªãã®ã¯èª°ã§ããïŒïŒã Rails 5ã«ã¢ããã°ã¬ãŒãããããã®åºæ¬çãªæé ã瀺ããªãã¬ã€ãããããŸããããã¯è¯ãããšã§ãããç¹ã«æŽæ°äžã«èœã¡ãgemããããã®äºææ§ããã®ä»ã®çµæžæ§ã«é¢ãã詳现æ
å ±ãå¿
èŠã§ãã å
¬å¹³ã«èšãã°ããã詳现ã«èª¿ã¹ãã°ã2çµã®é«è²Žãªçæã«æ²¿ã£ãŠæ©ãããšã¯ã§ããªãã£ãã§ãããïŒè©³çŽ°ã«ã€ããŠã¯åŸè¿°ïŒã ãããã£ãŠã以äžã§ã¯ã¬ã€ãããã®ããã€ãã®ãã€ã³ãïŒã€ãŸããããã€ãã®åºæ¬çãªå€æŽïŒã«èšåããŸãããããã¯ç§ãã¡ã«ãšã£ãŠéåžžã«éèŠã§ããããšãå€æããŸããã
é倧ãªåé¡ã®åå ãŸãã¯TLã§ã¯ãªããDR
䜿çšããå®ç³ã®äžã«ã¯ãRails 5ãšã®äºææ§ãäœããããŸã£ããäºææ§ããªããã®ããããŸãããã®ãããããããåãåã£ãŠã¬ãŒã«ããã€ãã£ãæ©èœã«çœ®ãæããããå®ç³ãåäœç¶æ
ã«ä»äžããå¿
èŠããããŸãã ãããã«ãããããªãã¯ããããéžã³ã質åã«çããå¿
èŠããããŸãïŒãã©ã®ããã«æ©èœããŸãããïŒãããããã¯æ©èœããŸããïŒããããããæ©èœãããããã«äœãããŸããïŒãã 次ã«ããã©ãŒã¯/ã³ã³ããªãã¥ãŒã·ã§ã³/ãããé©çšãéå§ããŸãã
Railsã®ã¡ãžã£ãŒããŒãžã§ã³ã«ç¶ãgemã®ã¡ãžã£ãŒããŒãžã§ã³ã®æŽæ°ããããã£ãŠãgemsãæäŸããã€ã³ã¿ãŒãã§ã€ã¹ãAPIãããã³ãã®ä»ã®ãã©ã°ã€ã³ã®å€§å¹
ãªå€æŽã ãããã®ããšã¯ã倧é亀æããã³/ãŸãã¯ä»¥åã¯åããŠãããã®ã®ã«ãããå¿
èŠãšããé£ã¹ç©ãæ±ããŸããã§ããã
- Core_extãã¿ããªã«æãããå«ãããŠããïŒå人䜿çšã®ããã®ã«ãŒãã«ãšgemã®ãããã æãæªæã®ããåŠæ ¡ã¯ããŸãã«ãããã®ããã§ããã ããªããããã©ã®ããã«æ©èœããã®ãããããããŠãªããããè¡ã£ãã®ããããgemã®æ°ããããŒãžã§ã³ã§ã¯ããã¹ãŠãå°çã«æžãçŽãããŸãããäœããã¹ããããªã©ã®è³ªåããããããããŸãã
å®ç³ã®æŽæ°
äœããèœã¡ãããã«ã¯ãäœããæŽæ°ããå¿
èŠããããŸãã åœç¶ãrails gemãšãã®äŸåé¢ä¿ããå§ããå¿
èŠããããŸãã ããã§ã¯ã1æ¥ã2æ¥éããããšãã§ããŸãããã¬ã·ãã¯ãããŸããã Gemfile ã Gemfile.lockã®åšãã®ã¿ã³ããªã³ãšã®ãã³ã¹ãããããããããããžã§ã¯ãå
ã®ãã¹ãŠã®ããªãã®ååãæŽæ°ããå¿
èŠããããšãã段éçãªç解ããããããå°ãªããšãåããªããªããŸãã æé ã¯æ¬¡ã®ãšããã§ãã
- ã®ã£ã³ã°ã¢ãã
- ã³ã³ãœãŒã«ãèµ·åããŸã
- ãµãŒããŒãèµ·åããŸã
- å°ãªããšã3ã€ã®ã¢ã¯ã·ã§ã³/ãªã¯ãšã¹ããé£ç¶ããŠå®è¡ãããŸãã
ãã®ãŸãŸã®é«
ä»ããã¹ãŠã«ã€ããŠã
alias_method_chainã¯èŠãããŠããŸã
ãŸã ç¥ããªã人ã®ããã«ïŒ prepend
ãè¡ãå¿
èŠããããŸãã èŠããã«ïŒèª°ããç¥ã£ãŠããinclude
ã«ãããã¯ã¯ã©ã¹ã®åã§ã¯ãªãã¯ã©ã¹ã®åŸã«ã¢ãžã¥ãŒã«ãè¿œå ããŸãã ããŸããšããŠ-ã¡ãœããã®æç¡ã«ãããããsuper
ãååŸããŸãã ããã§è©³çŽ°ãšäŸãåç
§ããŠãã ããã
å€ãã®æ°ããããã©ã«ãèšå®
ãããã¯rails app:update
ãä»ããŠçæããrails app:update
ã ãããããã®ã¿ã¹ã¯ã¯éåžžã«éŠ¬é¹¿ããŠããããã¡ã€ã«ãäœæããã ãã§ãããã§ã«ãã¡ã€ã«ã®1ã€ãæã£ãŠããå Žåã¯ãèªåã§ãããä¿æããŠãã ããã
å®ç³device_async
ããã€ã¹ã®æ°ããããŒãžã§ã³ã®å Žåãããã¯äžèŠã§ããã off.manuluã®æ°è¡ã®ã³ãŒãã«çœ®ãæããããŸãã å
¬å¹³ã«èšãã°ãããã¯Rails 4.2以éã§æ©èœããŸããã5ã€ã®ã¬ãŒã«ã§ã¯æçµçã«gemãæ©èœããªããªãããã¹ãŠãActiveJobã«æžãæããå¿
èŠããããŸãã
å®ç³çŒ¶
CanCanCanã«çœ®ãæããå¿
èŠããããŸã ã CanCanã®ãµããŒãã¯äžè¶³ããŠãããå€ãã®å»æ¢äºå®ã次ã
ãšç»å ŽããŠãããããRails 5.1ã§ã¯åé¡ã«ãªããŸãã äžè¬çã«ã亀æã«å€§ããªåé¡ã¯ãªãã¯ãã§ãã inherited_resourcesã®äžã§CanCanããªã«ãè¡ã£ããããããå°ãèŠåŽããŸããã
ãžã§ã ã°ã¬ãŒãã¹ã¯ã¬ãŒ
æã£ãŠãã æ¡åŒµ ãããããŒãžã§ã³ã 圌ã¯ããªã¯ãšã¹ãã§APIããŒã眮ãæããæ¹æ³ãç¥ã£ãŠããŸããã ããããSwaggerã®æåŸã®ã¡ãžã£ãŒããŒãžã§ã³ã§ã¯ã圌ã¯é«è²Žãªäºä»¶ãèŠãŸããã ãã®ããã3.0ãžã®ç§»è¡åŸã銎æã¿ã®ããã©ã³ãããŒã¯ãèŠã€ããããšãã§ãããå€ããããã¯æãã«æ¿å
¥ããå ŽæããããŸããã§ããã ãã®çµæãã«ã¹ã¿ã HTTPããããŒçšã®ããã¥ã¡ã³ãåãããæ©èœãããããšãå€æããŸããããããŸãããããå°ãå¯èŒžããªããã°ãªããŸããã§ãã ã ããã§ãã¹ãŠãæ©èœããŸãã
has_manyã¢ãœã·ãšãŒã·ã§ã³ã«ç¡å¹ãªãªããžã§ã¯ããæ¿å
¥ããŸã
ç¡å¹ãªãªããžã§ã¯ãã®é¢é£ä»ããhas_manyã«æ¿å
¥ããããšããã¹ãŠãRails 5ã«ãããããããŸãïŒãªããžã§ã¯ãã¯æ°žç¶åãããŠç¡å¹ã«ãªããã¡ã¢ãªå
ã§ã®ã¿äœæãããŸãïŒã 以åã¯ãä¿åãè¡ãããããŒã¿ããŒã¹ã®å
ã®ãªããžã§ã¯ããé¢é£ä»ãã«è¿œå ãããã¡ã¢ãªããã®å€æŽãã¹ããããããïŒãŸãã¯æ€èšŒãã¹ããããããïŒããxsã«äœãèµ·ãã£ãã®ããæ·±ãæãäžããããŠããŸããã§ãã
é¢ä¿ã®é£çµ
圌ã¯ã©ããã§é¢å©ããããåããŠããŸããã
ãã°ã§ã¯ãªããuniqã®å»æ¢
Uniqã¯distinctã«çœ®ãæãããã5.1ã§ã¯Reilationã®uniqãæçµçã«ã«ãããããŸãã ç§ãç解ããŠããããã«ãã€ãã«å®çŸããã®ã¯ããªã¬ãŒã·ã§ã³ãé
åãæš¡å£ããããšã¯æ©èœã§ã¯ãªããå€ãã®ããããã§ãããšããããšã§ãã
å®ç³postgres_ext
決å®çã«åãæãå¿
èŠããããŸãã 圌ãè¡ãæ¹æ³ãç¥ã£ãŠããã®ã¯ãraw-sqlããã³/ãŸãã¯Arelã䜿çšããŠç°¡åã«çœ®ãæããããšã§ãã çŸæç¹ã§ã¯ãgemèªäœã¯Rails 5ãšäºææ§ããããŸãããæ°ããã¬ãŒã«ã§äœ¿çšããããšãããšãããšãã°STIã¯ã©ã¹ã§count
ãåŒã³åºãå Žåãªã©ãæãäºæããªãå Žæã§ãšã©ãŒãçºçãcount
ã
ArgumentError: wrong number of arguments (given 1, expected 2)
äœããã®çç±ã§ãç§ãã¡ãšäžç·ã«åœŒã«ã¯ã»ãšãã©äœãèµ·ãããŸããã§ããã 圌ã¯ä»äºãç¶ããŸããã include_blank
ãå®è¡ãããã£ãŒã«ããrequire
æ©èœãäœäžããŸããã
ActiveRecordã®ãã®ä»
- ARã¯ãïŒç¹å®ã®ã¯ã©ã¹ã®ïŒå®æ°ãæ¡ä»¶ã«æž¡ãããšãèªããå®æ°ã§ã¯ãªãæååãæž¡ããšèšããŸãã å®éãããšãã°ãSTIã䜿çšããããŒãã«ã§ã®æ€çŽ¢ã®å ŽåïŒ
- ãã¹ãŠã®ã¢ãã«ã¯ã
ActiveRecord::Base
代ããã«ApplicationRecord
ããç¶æ¿ããå¿
èŠããããŸãã ã€ãŸããäžéã®æœè±¡ã¯ã©ã¹ã衚瀺ãããŸãã
class ApplicationRecord < ActiveRecord::Base self.abstract_class = true end
ããŒã¿ããŒã¹åãã¢ãã«ã«ãããã³ã°ããåçã倧å¹
ã«å€æŽããŸããã ç¹ã«ãããã¯column_names
ã¡ãœããã«é©çšãããŸãã å±æ§ãªã©ãä»ããŠãŠãŒã¶ãŒå®çŸ©ã®å±æ§ãè¿ããªããªããŸããïŒè©³çŽ°ã«ã€ããŠã¯ã4ã5ã¬ãŒã«ã®ARã§ãã®ã¡ãœããã®å·®åãåç
§ããŠãã ããïŒã attributes_to_define_after_schema_loads
ã®æŠå¿µattributes_to_define_after_schema_loads
ç»å ŽããŸããã ãããŠä»ããä»®æ³ãå±æ§ã«åºã¥ãããžãã¯ãããã column_names
ããã¹ãŠãè¿ãããã«ãããå Žåã次ã®ãããªããšãããå¿
èŠããããŸãã
def self.column_names super + attributes_to_define_after_schema_loads.keys end
å®æ°ActiveRecord::ConnectionAdapters::Column::TRUE_VALUES
ãŸãã ç§ã®ç¥ãéããå€ãã®äººãããã䜿çšããŠããŸããããä»ã§ã¯2ã€ã®ãªãã·ã§ã³ããããŸããæã§æ»ããã FALSE_VALUES
ã䜿çšããFALSE_VALUES
ã«åãæ¿ããããšã§ãã
- åŒæ°ã
reload
ïŒåŒ·å¶ãªããŒãã®å ŽåïŒã«æž¡ãããšã¯ã§ããŸããã 次ã«ãç¹å®ã®ãªã¬ãŒã·ã§ãã«ã§ãªããŒããåŒã³åºãå¿
èŠããããŸãã äŸïŒ
first_model = Model.first first_model.has_many_relation_name.reload
has_oneé¢é£ä»ãã«ã€ããŠãåæ§ã§ãïŒ
second_model = Model.second second_model.reload_has_one_relation_name
false
ãšãã«before_
ã³ãŒã«ããã¯ãåæ¢ãfalse
-ã«ããã¢ãŠããããŸãã ããã§ãã³ãŒã«ããã¯ã§æ瀺çã«throw(:abort)
ãããå¿
èŠããããŸãã ããã§ãããã«ã€ããŠé«è²ŽãªããªããŒãšMRã
raise_in_transactional_callbacks raise_in_transactional_callbacks=
ãã©ã¡ãŒã¿ãŒã¯raise_in_transactional_callbacks=
ãããã¯ãfalseãè¿ãããå Žåã«after_commit
/ after_rollback
ããå®è¡ãã¹ããŒãã圹å²ãafter_commit
ãŸãïŒä»¥åã¯éãã«ãã°ã«ã¡ãã»ãŒãžãæžã蟌ã¿ãäŸå€ãã¹ããŒããªãã£ãå¯èœæ§ããããŸãïŒã ãã®ããšã¯Rails 4ã§åæžãããŸããããæžãæãã«æ©ã人ã¯ã»ãšãã©ããªãããã§ãã ä»ããã®æã§ãããããã«å€ãæ¯ãèãã¯ãªããªããŸãã
ããã©ã«ãã§ã¯ãã¹ãŠã belong_to
ãŸãã ãã¹ãŠãå
ã®å Žæã«æ»ãã«ã¯ãconfig.active_record.belongs_to_required_by_defaultãã©ã¡ãŒã¿ãŒã䜿çšããå¿
èŠããããŸãã
ActiveRecord::Relation#update
ã¡ãœãããç»å ŽããŸãããããã«ãããã³ãŒã«ããã¯ãšæ€èšŒãåŒã³åºãããšã§Relation
ãæŽæ°ã§ããŸãã æ¬è³ªçã«ãããã¯ç ç³ã§ããããŒã¿ããŒã¹ãžã®å€ãã®ã¯ãšãªãããããã®äžã«ã¯åãªããããããããŸãã MRã®è©³çŽ°ã
- ããã§ãå¯äœçšãªã
LEFT JOIN
ãäœæã§ããŸãã Rails 5ããåã®ããŒãžã§ã³ã§ã¯ã OUTER JOIN
ã¯joinsãä»ããŠæ瀺çã«èšè¿°ã§ãã includes + referenceãŸãã¯åçã®eager_loadã䜿çšã§ããŸãã ã ã¢ããªã³ãšããŠãæå®ããããã¹ãŠã®é¢ä¿ã®ããŠã³ããŒããååŸããŸããããã¯ãäžèšã®ãã¹ãŠã®äž»ãªç®çïŒ joins
é€ãïŒãN + 1ã®è§£æ±ºã«åœ¹ç«ã€ããã§ãã çŸåšã ActiveRecord::Relation#left_outer_joins
ããããŸããããã¯ãå·Šçµåã ããè¡ãããã以äžã¯è¡ããŸããã 詳现ã«ã€ããŠã¯ã MRã«ã¢ã¯ã»ã¹ããŠãã ããã
ã³ã³ãããŒã©ãŒã®ãã©ã¡ãŒã¿ãŒ
çŸåšãããã¯HashWithIndifferentAccess
ã§ã¯ãªããç¬ç«ããã¯ã©ã¹ActionController::Parameters
ã§ãããäžäœäºææ§ã®ããã«ããã·ã¥ãæš¡å£ããŠããŸãmerge
ãããã·ã¥ãšããŠäœ¿çšãããå Žåãã€ãŸãmerge
ã update
ãªã©ãè¡ãå Žåãå€ãã®ããšãèªããŸã ã€ãŸããã¢ã€ãã¢ãæ£ããç解ããå Žåã params
2ã€ã®ç®æšããããŸããã¯ã©ã€ã¢ã³ãããparams
ãã®ãä¿åãã Strong Parametersã䜿çšããŠã³ã³ãã³ãããã£ã«ã¿ãªã³ã°ããããšã§ãã ä»ã®å€æŽãå ããªãã§ãã ããã ã€ãŸãã params
ã§ããŒã¿ãçŽæ¥å€æŽãããšãç¬èªã®ããŒã¿ãè¿œå ããã®ãšåãããã«å³ãæªããªããŸãã ãããã®ã¢ã¯ã·ã§ã³çšã«åå¥ã®ãªããžã§ã¯ããparams.to_h
ãã params.to_h
ãŸãã¯params.to_unsafe_hash
ãåŒã³åºããŠããã以åãšåãããã«ããã·ã¥ãåŠçããŸãã
ãšã©ãŒã«ããã¢ãã«ãžã®ãšã©ãŒã®è¿œå [] =
ActiveModel::Errors#[]=
Rails 5.1ã§èŠãããŸãããæçµçã«ã¯model.errors.add(:name, "can't be blank")
ã䜿çšããå¿
èŠmodel.errors.add(:name, "can't be blank")
ã ãã¡ãããããã«é¢ãããã°å
ã®ã¡ãã»ãŒãžã¯ååšããŸãã
ã¢ã¬ã«ã«ã€ããŠå°ã
ãªããžã§ã¯ãèªäœã転éããããã«id
ãã£ãŒã«ãã®Arelããã®eq
ïŒããã³ãããããåæ§ã®è¿°èªïŒã§ïŒä»ã®ãã£ãŒã«ãã§ã¯ãã¹ãŠåé¡ãããŸããïŒã4ã¬ãŒã«ã§èå¥åïŒpkïŒããã®ãªããžã§ã¯ãããåŒãåºããããªã¯ãšã¹ãã§çœ®æãããŸããããããŠã5ã€ã®ã¬ãŒã«ã§ã¯ããã¯èµ·ãããŸããã pkããã«ããããšãã代ããã«ããªããžã§ã¯ãã¯åã«NULLã§çœ®æããããaccount_id = NULLãã®ãããªãã®ãååŸãããŸãã äŸïŒ
ãããã£ãŠãæå³ãåžžã«æ瀺çã«ç€ºãããã«ããŠãã ããã
skip_callbackã«ã€ããŠ
4ã€ã®ã¬ãŒã«ã®skip_callback(:create, :after, :my_method)
ã䜿çšãããšããã©ã¡ãŒã¿ãŒã転éã§ããã³ãŒã«ããã¯ãã§ãŒã³ã«ãã®ãããªã¡ãœããããªããŠãã¯ã©ãã·ã¥ããŸããã5ã€ã®ã¬ãŒã«ã§ã¯ã次ã®ã¡ãœãããèŠã€ãããªãã£ãå Žåãåãã¡ãœãããå®è¡ãããŸãã¹ãããããå¿
èŠããããŸãã ãããã£ãŠãå¥åŠãªè»¢åãçºçããå¯èœæ§ãããããå°å¹Žã¯ããã®ãïŒããç解ããããã«ãç£æ¥èå€åŠãæãäžããå¿
èŠããããŸãã
ã¬ã³ããªã³ã°ã®å°ããªé©åœ
å€æŽ:text
mime_type
ãæ瀺çã«ç€ºã:text
ããã³ãã®ä»ã®åœ¢åŒã 眮æ:nothing
:head
ãªã© ã€ãŸãã圌ãã¯ãã®èµ·æºã«æ»ããååãæ¬è³ªã«è¿ã¥ãã䞻婊ãç解ããã®ã«ã¢ã¯ã»ã¹ã§ããªãããã«ããŸãã
ãã¹ãå®è¡ã®é åºãå€æŽãã
çŸåšãããã©ã«ãã®å®è¡é åºã¯:random
ã§ãã ãã¹ããå®è¡ã·ãŒã±ã³ã¹ã«äŸåããŠããå Žåãããã¯ããŸãè¯ããããŸããããå€ãåäœãè¿ãã®ã¯éåžžã«ç°¡åã§ãïŒ
Rails.application.configure do config.active_support.test_order = :sorted end
ãªãã¶ãŒããŒ
ä»ãŸã§ïŒãŸãã¯ãã§ã«ïŒ5ã€ã®ã¬ãŒã«ã§ãããããµããŒãããŠãã人ã¯ããŸããã å
ã®ãªãã¶ãŒããŒã¯4æ¬ã®ã¬ãŒã«ã§åæ¢ããŸããã ãŠã£ã¶ãŒãã§ã¯ã5ã®ãµããŒãã宣èšããŸããããäœãæ©èœããŸããã 5ã¬ãŒã«ã®ãªãã¶ãŒããŒã«ä»£ããæ¥æ¬äººãããŸãïŒã³ããŒã¢ã³ãããŒã¹ãããã©ã³ãå€æŽã«éåžžã«äŒŒãŠããŸãïŒãããããæ©èœããŸããã æåã®æ¹æ³ã¯ããã€ãã£ãã®ARã³ãŒã«ããã¯ã䜿çšããããšã§ãã
ActiveRecordã®ãã°
ã«ããã«ãèŠã€ããŸããïŒ
- 1ã€ç®ã¯
ActiveRecord::Associations::CollectionProxy
ã«é¢ããå€ãuniq
ã§ããããã¯æåã§ããããšãå€æãã5.1ã§æ¢ã«ä¿®æ£ãããŠããŸãã - 2ã€ç®ã¯æ°ãããããèå³æ·±ããã®ã§ããARã¢ãã«ã®å±æ§ãæé»çã«ããªãŒãºããã«ã¯ã©ãããã°ããã§ããã
å®ç³ã®è©ãããã£ãŒ
ããã3.1.1ã«æŽæ°ããå€ãã®ç°ãªãå°ããªãã®ãåŸãŸããïŒ
- 倧æåãšå°æåãåºå¥ããããã©ã«ãã®
email
ãã§ãã¯ããããŸããã - ã¹ã³ãŒããã§ãã¯ãããå³ãããªããŸããïŒã¢ãã«ã®
uniqueness
ããã«scope
ãæå®ãããŠããå Žåã§ãã以åã«should validate_uniqueness_of(:name)
ãæž¡ããããšããã¹ããã¯ã©ãã·ã¥ããæ瀺çã«æå®ããshould validate_uniqueness_of(:name).scoped_to(:vendor_id)
ãŸãshould validate_uniqueness_of(:name).scoped_to(:vendor_id)
; - çŽååãããå±æ§ããã§ãã¯ãã
should serialize(:metadata).as(Hash)
ãããããcast_type
ã§cast_type
ããcast_type
ãŸãã - 以åã
allow_value('foo', 'bar', 'baz')
ã¡ãœããallow_value('foo', 'bar', 'baz')
ã¯æž¡ãããåŒæ°ããæåã®å€ã®ã¿ãååŸããŠããŸããããçŸåšã¯ä¿®æ£ããããã¹ãŠãååŸããããã«ãªããŸããã
移è¡
ã€ã³ããã¯ã¹åã®åœ¢ææ¹æ³ãšãåŸæ¹äºææ§ãå®å
šã«ç Žã£ãä»ã®ããã€ãã®æ¹æ³ãå€æŽããŸããã ãããã£ãŠããã¹ãŠã®ç§»è¡ã«å¯ŸããŠãããããäœæãããããŒãžã§ã³ãæ確ã«ç€ºãå¿
èŠããããŸãã ã¯ã©ã¹ãã©ã¡ãŒã¿ãŒã䜿çšããŠæå®ããŸãã
class OldMigrationName < ActiveRecord::Migration[4.2] ... end class NewMigrationName < ActiveRecord::Migration[5.0] ... end
ãŸãã references
ã®ãªãã·ã§ã³ã§foreign_key
ãæå®ããããšãã§ããŸããã ãããŠããžã§ãã¬ãŒã¿ãŒã®ããã©ã«ãèšå®ãå°ãå€æŽããŸãã ïŒããã©ã«ãã§ã¯ãpkïŒãã®idïŒã¯æŽæ°ã§ã¯ãªãuuidã«ãªããŸãã
äœããã®çç±ã§ã移è¡å
ã®ãã¿ãŒã³ã®å®çŸ©ã«ãåé¡ããããŸããã ã€ãŸãããã©ãŒã ã®äžéšã§ïŒ
class SomeMigration < ActiveRecord::Migration class StubForModel < ActiveRecord::Base has_one :something end def up StubForModel.destroy_all end def down
誰ããBase
èŠã€ããããªããšèªã£ãŠããŸãã çç±ãããããŸã§ã泚æããŠãã ããã 解決æ¹æ³-説æãæŽæ°ããŸãã
ã³ã³ãããŒã©ãŒå
ã®ã³ãŒã«ããã¯ã®ã·ãŒã±ã³ã¹
Rails 4ã§ã®csrf
ããŒã¯ã³ïŒåœé ããã®ä¿è·ïŒã®ãã§ãã¯ã¯åžžã«äžãããã³ã³ãããŒã©ãŒã®æåã®ã³ãŒã«ããã¯ã«ãã£ãŠè¡ãããŸããã Rails 5ã§ã¯ãã©ãã«ãäžããããå®çŸ©ãããå Žæã«åŸã£ãŠå®è¡ããprepend: true
ãäžããå¿
èŠãããå Žåã¯ã prepend: true
æ瀺çã«æå®ããå¿
èŠãããprepend: true
ã
ãã¹ãŠã¯åé¡ãããŸããããæåã«äžããããã¬ã€ãã泚ææ·±ãèªãã ããã«ã¯èŠããŸããã§ããã èªèšŒã倱æããŸããã ããã€ã¹å
šäœãæãèµ·ãããã»ãšãã©éæ³ãä¿¡ããŠããŸããã ããããæåã¯ããã€ã¹ããã©ã¡ãŒã¿ããããŒã¯ã³ãæ£åžžã«èªèšŒããŠåãåãããã®åŸåœé ããä¿è·ããã湟æ²ããïŒå®éã«æ¬ èœããŠããïŒããŒã¯ã³ã«éåžžã«æã£ãŠããããšãå€æããŸããã
ãã³ãããã
ãä»ã®äººãžã®åœŒã®äŸã¯ç§åŠã§ã...ã
- ã³ã³ãããŒã©ãŒã®ãã¹ãã§ã¯ãCookieé åã®æ·±ãããã¹ã¿ãã¯ã¬ãã«ããã¯ã©ãã·ã¥ããŸã ã 圌ãã¯ããã€ãã®æããé ãå£ãã2åç®ã¯RequestStoreã«é¢é£ãããã³ãã£ãããçºæãããŸã§ãã»ãšãã©éæ³ãä¿¡ããŠããŸããã
- äžèšã®csrfããŒã¯ã³ã®ã±ãŒã¹ã¯ã
飲ãã èªèšŒãããã å®éã csrf
ããŒã¯ã³ã®2ã€ã®ãã§ãã¯ããããŸããcsrf
ã€ã¯ããã€ã¹ã®åããã1ã€ã¯åŸã§ãã ããã¯ãåé¡ã®æ€çŽ¢ã®ç°¡çŽ åã«ã¯ãŸã£ããè²¢ç®ããŸããã§ããã - 以åãåè¿°ã®CanCanã«ãããããé©çšãããå¿«é©ãªãã®ã¯ã»ãšãã©ãããŸããã§ããã
- ç¬èªã®å®æãã
ActiveRecord::Type
ããããŸããããããã¯æ°ããã¬ãŒã«ã§ã»ãšãã©æãäžããããŸããïŒ ãã ã ãããªãã ActiveModel
ã«è»¢éãããŸããã - 説æã§ããããšã¯ä»ã«ããããããããŸããããããã¯æ°ããã¬ãŒã«ãžã®ç§»è¡ã«ã»ãšãã©åå ããªãã£ããããåŸã§äœ¿çšããŸãã
ãªãç§ã¯ããããã¹ãŠãã£ãŠããã®ã§ããïŒ core_ext
ã¯ãã¹ãã§ã¯ãããŸããã 絶察ã«ã ãããŠãæ°ããã¬ãŒã«ãžã®ç§»è¡ã¯ããããããå§ããŠãã§ããéãã«ããããŠãéåžžã«ããããå€èŠ³ã§ä»ã®ãã¹ãŠãèŠãŠããã®æ¡åŒµã®åºçŸåã®æŽå²ïŒééããªãéåžžã«ãŸã ãã«ãªã£ãŠããïŒãèŠããŠããããã®å€§ããªçç±ã§ãã ãã®ããã移è¡äžã«ãã€èœã¡ãããç解ããã®ãã¯ããã«ç°¡åã«ãªããŸãã
RubyããŒãžã§ã³ã®ã¢ããã°ã¬ãŒã
æ£çŽãªãšãããç§ãã¡ã¯ç¿åŸããŠããŸããã 2.2.3ã®åŸã2.4.0ã匷åã«ã¹ã¿ãã¯ããŠãç§ãã¡ã¯æªç¥ã®ãŽãã®æããããåãã2ã€ã®æ®µéã«é²ãããšã決ããŸããïŒæåã«ãRuby 2.3.3ãããã¯éåžžã«é©åœçãªãã®ã¯ãªããæ°ããã¬ãŒã«ãžã®ç§»è¡ã§ãã ãããŠ-ã«ããŒãæŽæ°ããŸãã ãããã£ãŠããããŸã§ã®ãšãããæ°ããã«ããŒã«ã€ããŠã¯äœãèšããŸããã gemã®ãã€ãã£ãæ¡åŒµãã³ã³ãã€ã«ããå Žåã移è¡ã®åé¡ã®ã»ãšãã©ã¯åé¿ãââããæ·±å»ãªé害ã¯ãªããšããçµéšè±å¯ãªä»²éã®æèŠããªãéãã
ããžãã¯ïŒæéãšæ¬²æ±ããããã©ãããèããã¿ã¹ã¯ïŒ
æ°ããã¬ãŒã«ãžã®ç§»è¡ã«é¢ä¿ãªãã移è¡äžã«çºæãããŠæ©èœããã¯ãã®å¥åŠãªã³ãŒãã«éããŸãããããããã¹ãã§ã¯ãããŸããïŒARã¯ã©ã¹ã®3ã€ã®ãã¡ã€ã«ã®èŠçŽïŒã
class Base TYPES = {first: First, second: Second} end class First < Base; end class Second < Base; end
ãã®ããšã¯ããã®ãžã£ã³ã«ã®ãã¹ãŠã®æ³åŸã«ãããæ©èœããŸããïŒãã ããäžè¬çã«Rails 4/5ã®ã¯ãªãŒã³ãããžã§ã¯ãã§ã¯æ©èœããŸããïŒã çžç¶äººã®ããããã«ã¢ã¯ã»ã¹ãããšãèªåããŒãã¯ã¯ã©ã¹ã®åšæçãªããŒãã«å
¥ããã¯ã©ãã·ã¥ããŸãã æåã«åºæ¬ã¯ã©ã¹ã䜿çšãã次ã«çžç¶äººã䜿çšããå Žåããã¹ãŠãæ£åžžã§ãã ããããäœããã®çç±ã§ãRails 4ã§ã¯æ©èœããŸããããRails 5ã§ã¯èœã¡ãŸããããä»ã®ãã¹ãŠãããæ©ãBase
ãããŠã³ããŒãããæ瀺çãªåŒã³åºããèŠã€ããããšãã§ãããèªåããŒãã«é¢é£ãããã®ã¯ãŸã£ãã觊ããŸããã§ããã ä»ã®èª°ãããããã©ã®ããã«æ©èœãããããŸãã¯Rails 5ã®èªåããŒãã«äœãèµ·ãã£ãã®ããç¥ã£ãŠãããªããç§ã«ç¥ãããŠãã ããã
çµãã
èªãã§ãããŠããããšãã å°ãªããšãäœããããªãã®åœ¹ã«ç«ã€ããšãé¡ã£ãŠããŸãïŒãŸãã¯æ¢ã«äŸ¿å©ã«ãªã£ãŠããããšïŒããããŠç§»è¡ã®ããã®æéãå°ãªããšãå°ãã¯ç¯çŽããŸããã
ãããã¯ã«é¢ããããªãã®ç¥èãšçµéšã§ã¯ãªããã³ã¡ã³ãã§å
±æããããšãheããªãã§ãã ããã