give IT a try

プログラミング、リモートワーク、田舎暮らし、音楽、etc.

Rails 6リリース記念!?Qiitaにいろいろ記事を書きました

先日、Rails 6が正式にリリースされました。

だから、というわけでもないのですが、Rails関連の記事をいくつか書いてQiitaにアップしています。

Railsアプリのアップグレードの手順

1つ目はRailsアプリのアップグレード(バージョンアップ)の手順です。

永久保存版!?伊藤さん式・Railsアプリのアップグレード手順 - Qiita
qiita.com

これまでに何度もRailsアプリのアップグレード作業を繰り返してきた僕が編み出したベストプラクティス、いわば「秘伝のタレ」的なノウハウが詰め込まれております。
記事としてはやや長文です。

config.load_defaultsとnew_framework_defaults_x_x.rbの解説記事

2つ目はこれまたRailsアップグレード時に登場するconfig.load_defaultsとnew_framework_defaults_x_x.rbの解説記事です。

config.load_defaultsとnew_framework_defaults_x_x.rbの関係を詳しく調べてみた - Qiita
qiita.com

ぶっちゃけ、このあたりの設定はしっかり把握しておらず「なんとなく雰囲気で」使ってきてた感があったので、じっくり調べてその調査結果をまとめてみました。
Railsガイドを読んでもここまで詳しく説明されていないので、以前の僕みたいに「なんかようわからん」と思っている人は一読の価値があると思います。

Rails 6.0.0で発生する警告文に関する情報

3つ目はRails 6へアップグレードしている最中に発生した警告文に関する情報です。

Rails 6に上げると”DEPRECATION WARNING: Initialization autoloaded the constants ActionText::ContentHelper, and ActionText::TagHelper.”のような警告が出る - Qiita
qiita.com

Rails本体のissueなのでそのうち修正されるとは思いますが、僕がググったときは「これ!」という日本語記事が見つからなかったので、同じように困ってる人がすぐに見つけられるようにQiitaに書いておきました。


ためしに手持ちのRailsアプリをRails 6に上げてみました

Rails 6がリリースされたので、ためしに手持ちのRailsアプリをRails 6に上げてみました。
アップグレードしたのは妻のパン屋のWebサイトです。

coupe-baguette.com

外から見てもよくわからないと思いますが、いちおうRails 6 + Ruby 2.6 + Herokuで動作しています。

アップグレード時に発生したその他のトラブル

詳細な原因は追えていませんが、アップグレード時にはいくつかのトラブルが発生しました。
Rails 6になったせいなのか、Rails以外のgemを上げたせいなのか、はたまたHerokuのスタックをheroku-18に上げたせいなのか、どれが引き金になっているのかは僕もよくわかりません。

トラブル1:サーバーが起動しない

デプロイ直後に以下のエラーが出てサーバーが起動しなくなりました。

Errno::ENOENT: No such file or directory @ rb_sysopen - tmp/pids/server.pid 

Procfileにtmp/pidsディレクトリを作成するコマンドを追加したら動きました。

 release: bundle exec rake db:migrate
-web: bundle exec puma -C config/puma.rb 
+web: mkdir -p tmp/pids && bundle exec puma -C config/puma.rb
トラブル2:jsやcssが404エラーになる

サーバーは起動するようになりましたが、今度はjsやcssが軒並み404エラーになって「素のHTMLを表示しているだけ」の状態になってしまいました。

この件はRAILS_SERVE_STATIC_FILES=1という環境変数をHerokuに追加することで直りました。
(これでいいのか確信はありません・・・)

トラブル3:hamlの文字参照が文字にならない

全角チルダ(〜)をきれいに表示するために、~という文字参照をところどころで使っています。
ですが、この文字参照がそのまま~で表示される画面が出てきました。

ふつうに文字が表示されるよう、一度.html_safeしているのですが、ここではさらにもう一度.html_safeすることで修正できました。

 - menu_items.each do |img, name|
   - name = name.html_safe
   %figure
     = image_tag "menus/#{img}.jpg", alt: name
     %figcaption
-      %h2.text-shadow= name
+      %h2.text-shadow= name.html_safe

2019.8.20追記
この件はRails側の不具合だったようです。以下のpull requestで修正済みです。
(Rails 6.0.1のタイミングでリリースされるかな?)

Prevent TagBuilder modify options by tsuka · Pull Request #36981 · rails/rails · GitHub

情報提供してくれた、tkawaさん、tsukaさん、どうもありがとうございます!


その他、最近書いたQiita記事

ついでに、最近書いたその他のQiita記事も紹介しておきます。

統合テストはリクエストスペックに移行させよう、という話

【動画付き】Railsチュートリアルの統合テスト(integration test)は、RSpecのリクエストスペックに置き換えるのがラクです - Qiita
qiita.com

Rails標準の統合テスト(integration test)をRSpecに書き換えるなら、リクエストスペックがいいですよ〜、という解説記事です。
解説動画も作りました。


Railsチュートリアルの統合テスト(integration test)は、RSpecのリクエストスペックに置き換えるのがラクです

Cloud9上でフィーチャスペックを動かす方法

【2019年7月版・動画付き】Cloud9上でEveryday Railsの`js: true`付きのフィーチャスペックを実行する手順 - Qiita
qiita.com

Cloud9上でEveryday Railsのフィーチャスペックを動かす方法を解説した記事です。
こちらも動画付きです。


【2019年7月版】Cloud9上でEveryday Railsの`js: true`付きのフィーチャスペックを実行する手順

Cloud9、Chrome、ChromeDriverは、いずれもRubyから見ると外部リソースになるので情報をきれいに同期させるのが難しいですね。

strftimeじゃなくてlメソッドを使おう、という話

【初心者向け・動画付き】Railsで日時をフォーマットするときはstrftimeよりも、lメソッドを使おう - Qiita
qiita.com

最後に紹介するのは「お前ら、すぐにstrftimeに頼らず、l(える)メソッドを使っていこうぜ」という啓蒙記事です。
lメソッドはググラビリティが悪いせいか、どうもstrftimeの方がよく使われている気がします。
でも僕は使っていません。みなさん、日時フォーマットはDRYに書きましょう。

こちらもやはり動画付きです。

【初心者向け】Railsで日時をフォーマットするときはstrftimeよりも、lメソッドを使おう

別にYouTuberを目指しているわけではないのですが、「文章で書くより、画面を見せながら口で話した方が早くてわかりやすい」と思ったときは、先に動画を作って、その内容をQiitaとかに簡単にまとめるようにしています。

宣伝:何はともあれテスト!テスト!!Everyday Railsでお勉強しましょう

Railsのアップグレードには自動テストが必要不可欠です。
テストが苦手な人は「Everyday Rails - RSpecによるRailsテスト入門」を読んで、テストの自動化をマスターしましょう!
まだ読んだことがない方はぜひチェックしてみてください😄

Everyday Rails - RSpecによるRailsテスト入門
leanpub.com