バンビのブログ

駆け出しのエンジニアです!日々の疑問など備忘録として書いていきます。

書き途中です。「Rails5.2」 から 「Rails6」へバージョンアップ

「Rails5.2」 から 「Rails6」へバージョンアップ

【注意】 * バージョンアップを行なうときは既存コードでサポートされないコードがあるか確認すること。 * バージョンアップ後に動いていないコードや機能を発見するために自動テストを必ず準備しておくこと(とくにビジネスロジックあたりは必ずテストを用意) * バージョンアップはリリースされているバージョンを飛ばして行わないこと。v5.2 -> v6 は良いが、v4 -> v6はNGです。 * アップデートの必要な箇所を洗い出してから行なうこと。 * 追加機能や機能の変更点を把握しておくこと。

Rails6の更新事項

  • Rails 6ではRuby 2.5.0以降が必須。(うちはRuby 2.6.2なので関係大丈夫です)
  • フロントエンドの管理ライブラリを 『Assert Pipeline』 から 『webpacker』 に移行するかどうか?
  • Action Cable JavaScript APIの変更があるが、action_cableは使われていないので対応しなくて大丈夫です。
  • ActionDispatch::Response#content_typeがContent-Typeヘッダーを変更せずに返すようになった(使っていないので大丈夫です)
  • Zeitwerkというオートローダーが採用された。
※前提として、定数解決というものを理解しないとオートローダーの中身は理解しにくいです。

1. オートローダーはファイルを読み込む際に require '読み込ませたいファイル名' を記述しなくてもファイルや階層などの命名規則に沿った書き方をしていれば自動的に読み込む(探し出してくれる)こと。
2. 1つのファイルにトップレベルのクラス定義できるのは1つのみ。
  例 a.rbファイルに 
  class a 
  end  
  
  class b 
  end と2つ定義するのはNG。 

  Foo = Class.new do
  end
   みたいなクラスの作り方もNG。
 
  ネストして 
  class a 
   class b 
   end 
  end
  となるのはOK3. 標準のconcernsディレクトリ(app/models/concernsなど)に置かれたファイルでは、Concernsを名前空間化できない。
   疑問に思っていなかったかもしれないけど、ディレクトリの配下は基本名前空間を記述するのだけどConcernsは名前空間を書かなくて良いとなっている。
  例 app/models/concerns/hogehoge.rbで定義されるのは

       class Concerns::Hogehoge
       end
       と書くのが一般的だが、Concernsにおいては名前空間を書かなくても良いclass Hogehoge
       end
       と書けば読み込んでくれます。
※もし、作成したファイルが読み込まれていないと思ったときは、このオートローダーをデバックすると読み込まれているか確認できる。
  puts ActiveSupport::Dependencies.autoload_paths
  
   1.もし読み込まれていなかったら、再起動する。(開発環境では config.cache_classes = false で変更があれば更新されるようになってる)
   2.そもそも読み込みされないのであれば config.autoload_paths をつかって config/application.rb に追記する。
   3.追記したあと、それぞれのファイルの命名規則などがあっているか確認する。命名規則が間違えていると読み込まれないので注意。
  • ActionDispatch::HostAuthorizationというDNSバインディング攻撃を防ぐための機能が追加されました。
ローカル実行されているRailsアプリケーションに対して悪意のあるアクセスをし、ローカルENV(環境変数)情報や、ローカルRailsアプリの全情報にアクセスできて、情報丸パクリされる攻撃みたいです。
詳しくは調べて、理解した人追記おねがいします。

自分たちが開発してるPCの開発環境に外部からアクセスする方法があります。ngrokというサービスです。
ngrokとは、localhostで動いているサーバーを、LANの外からアクセスできるようにできるツールです。
vagrantなどのローカル環境を一時的に外部に公開できるため、webhookなどの受信が必要なシステムでも、ローカルで動かすことが可能となります。

基本的にはActionDispatch::HostAuthorizationを変更することはないはず。

develop環境でデフォルト設定されているのが以下です。
Rails.application.config.hosts = [
  IPAddr.new("0.0.0.0/0"), # All IPv4 addresses.
  IPAddr.new("::/0"),      # All IPv6 addresses.
  "localhost"              # The localhost reserved domain.
]

もしどこかのドメインからローカル環境にアクセスを許可したい場合は、

# '○○○.com'からのアクセスを許可する設定はこのように書きます。
/frien/config/environments/development.rb

Rails.application.config.hosts << '○○○.com'

# 'www.○○○.com'や'blog.○○○.com'などの
# サブドメインを許可する設定
Rails.application.config.hosts << '.○○○.com'

※develop環境以外では有効になっていないので、手動で設定が必要となる。
  • コンソールで rails routes を表示させるときに、rails routes --expanded オプションをつけると見やすく表示する機能が追加!