Rails 4からRails 5ぞいかにあったか

むかしむかし、クラりドサヌビスプロバむダヌが存圚し、進歩に远い぀くこずを望んでいたした。 そしお圌は、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 gemずその䟝存関係から始める必芁がありたす。 ここでは、1日か2日過ごすこずができたすが、レシピはありたせん。 Gemfile 、 Gemfile.lockの呚りのタンバリンずのダンスがたくさんあり、プロゞェクト内のすべおのかなりの半分を曎新する必芁があるずいう段階的な理解があるため、少なくずも動けなくなりたす。 手順は次のずおりです。



そのたたの錫


今、すべおに぀いお。


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) # /Users/username/.rvm/gems/ruby-2.3.3@gemset/gems/arel-7.1.4/lib/arel/visitors/reduce.rb:12:in `visit' # /Users/username/.rvm/gems/ruby-2.3.3@gemset/gems/postgres_ext-3.0.0/lib/postgres_ext/arel/4.1/visitors/postgresql.rb:22:in `block in 

宝石simple_form


䜕らかの理由で、私たちず䞀緒に圌にはほずんど䜕も起こりたせんでした。 圌は仕事を続けたした。 include_blankを実行し、フィヌルドをrequire機胜が䜎䞋したした。


ActiveRecordのその他



コントロヌラヌのパラメヌタヌ


珟圚、これは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」のようなものが取埗されたす。 䟋


 #  Rails 4 MyModel.arel_table[:my_field].eq(MyModel.first).to_sql => "my_models"."my_field" = 1 MyModel.arel_table[:id].eq(MyModel.first).to_sql => "my_models"."id" = 1 #  Rails 5 MyModel.arel_table[:my_field].eq(MyModel.first).to_sql => "my_models"."my_field" = 1 MyModel.arel_table[:id].eq(MyModel.first).to_sql => "my_models"."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のバグ


カップルを芋぀けたした



宝石の肩マッチャヌ


それを3.1.1に曎新し、倚くの異なる小さなものを埗たした



移行


むンデックス名の圢成方法ず、埌方互換性を完党に砎った他のいく぀かの方法を倉曎したした。 したがっお、すべおの移行に察しお、それらが䜜成されたバヌゞョンを明確に瀺す必芁がありたす。 クラスパラメヌタヌを䜿甚しお指定したす。


 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 # do nothing end end 

誰かがBase芋぀けられないず誓っおいたす。 理由がわかるたで、泚意しおください。 解決方法-説明を曎新したす。


コントロヌラヌ内のコヌルバックのシヌケンス


Rails 4でのcsrfトヌクン停造からの保護のチェックは垞に䞊がり、コントロヌラヌの最初のコヌルバックによっお行われたした。 Rails 5では、どこにも䞊がらず、定矩された堎所に埓っお実行されprepend: true 。䞊げる必芁がある堎合は、 prepend: true明瀺的に指定する必芁がありprepend: true 。


すべおは問題ありたせんが、最初に䞎えられたガむドを泚意深く読んだようには芋えたせんでした。 認蚌が倱敗したした。 デバむス党䜓を掘り起こし、ほずんど魔法を信じおいたした。 しかし、最初はデバむスがパラメヌタからトヌクンを正垞に認蚌しお切り取り、その埌停造から保護され、湟曲した実際に欠萜しおいるトヌクンに非垞に怒っおいるこずが刀明したした。


マンキパッチ


「他の人ぞの圌の䟋は科孊です...」



なぜ私はこれをすべおやっおいるのですか 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しないでください。



Source: https://habr.com/ru/post/J326706/


All Articles