Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

週刊Railsウォッチ: Rails 7 Alpha 1と2が公開、Rubyハッシュのショートハンド記法、iCare Dev Meetupほか(20210921)

こんにちは、hachi8833です。RubyKaigi Takeout 2021が終わりましたね。

週刊Railsウォッチについて

  • 各記事冒頭には🔗でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
  • 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です👄
  • お気づきの点がありましたら@hachi8833までメンションをいただければ確認・対応いたします🙏

TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)

今週の週刊Railsウォッチは祝日が多いので短縮版でお送りします。また、来週の週刊Railsウォッチはお休みいたします🙇

🔗 特集: Rails 7 Alpha 1と2がリリース

なおつっつきの後で、Alpha 1と同じ日にAlpha 2もリリースされていたことに気づきました。


つっつきボイス:「Alpha 1出た🎉」「ちょっと前からDHHのYouTube動画チャンネルにもRails 7 Alphaプレビュー情報が出ていたのでそろそろ出る頃かもと思っていたところ」「DHHの動画はコードも見えるので比較的イメージを掴みやすいと思います: おすすめ👍」「あとで見ようっと」

🔗 Rails 7は選択肢を複数用意する方向へ

「これまでのRailsはConvention over ConfigurationのようなRails wayに沿って進めるのが望ましいという立ち位置でしたが、今回のRails 7 Alpha 1リリースを眺めていると、Hotwireが入るけどHotwire一択ではないという点がこれまでと違うかなという気がします」「あ、そうかも」「これまでRailsを使い慣れている人はRails wayから適切に外れるノウハウを身につけていて、人によってはたとえばTurbolinksを速攻で外したりすることもありましたよね」

turbolinks/turbolinks - GitHub

「Railsも成熟したんだなという気持ち」「Webpackも使いたければ使っていいよというのはありがたい🙏」「そういえば最近はリリースノートでも言及されているesbuildがいいらしいという噂もちらほら見かけますね」

evanw/esbuild - GitHub

以下はつっつき後に見つけたツイートです。

「リリースノートにはこれまでチェックしてきたActive Record暗号化(ウォッチ20210412)やmarginalia-gem風のQueryLog追加(ウォッチ20210906)などがフィーチャーされていますね」「Active Record暗号化うれしい😂」「load_asyncってもう入っているような気持ちになっていたけどまだだったか(ウォッチ20210222)」「そういえば少し前の銀座Rails#33でもload_asyncを取り上げていましたね↓」

「Rails 7へのアップグレード手順は、JS環境を完全にHotwireベースに乗り換えるなら作業量が増えそうだけど、今の構成のままでよければそこまで増えなさそうかな」「アップグレード楽しみです😋」「デフォルトのvariant(サイズ違いの画像)生成がmini_magickからvipsに変わるとは知らなかった(#42744)」

libvips/ruby-vips - GitHub

🔗Rails: 先週の改修(Rails公式ニュースより)

今回は以下の公式更新情報を取り上げます。

🔗 sass-railsへのデフォルト依存を削除

最近のWebアプリケーションでは、Tailwind、Bootstrap、BulmaなどのCSSフレームワークを使うことが増えている。Railsは、まだすべてを手書きしているかのようなモデルごとのスタイルシート生成を行うべきではない。
また、Sassはdart-sassに注力することを選んだが、dart-sassはRailsがデフォルトで採用していないあらゆる依存関係を必要とする。そこで、Sassへの依存を減らしてオプションとして追加することにした。
同PRより


つっつきボイス:「sass-rails gemが消されたのかと思ったら、デフォルトではsass-ralisを使わないことにしたのね: Sassを引き続き使いたかったらSprocketsかWebpack-dev-serverかそれらに相当する何らかのアセットプリコンパイラが必要ということになるでしょうね」「たしかに」「もちろん必要なら自分でSassをインストールすればOK」「sass-ralisがデフォルトでなくなるのはそれはそれで嬉しいかも」

rails/sass-rails - GitHub

「アセットプリコンパイル、結局よくわからずじまいでした」「アセットプリコンパイルは果たしてサーバーサイド側の責務なのか、それともフロントエンド側なのかという問題は以前からありますね」「ありますあります」「Railsはこれまでサーバーサイドでアセットプリコンパイルするという考え方でしたね」「それが今回デフォルトからは消えたということか」「RailsコマンドにSassインストール用のオプションが入るといいですよね」「まだオプションは見当たらないけどあるとよさそう」

「ところでDHHはTailwind cssを推しているような気がしますね」「Tailwind、まだ使ったことないんですけど流行っているんでしょうか?」「いわゆるユーティリティ系CSSフレームワークでは世間的には有名ですね: フロントエンド界隈ではTailwindを使うことがデファクトというわけではないと思いますが、個人的にはユーティリティ系CSSフレームワークを使うならTailwindでもいいのではとは思います」「なるほど」

参考: Tailwind CSS - Rapidly build modern websites without ever leaving your HTML.

「TailwindはIDEがサポートする前提で人間が手書きする感じではないのが個人的に何となく合わないんですが、かといってSassならいいというほどでもないんですよね」「Tailwindが生成するCSSを見ていると、CSSのカスケーディングという仕様が現代のコンポーネント化されることを想定したWebページに合わなくなってきてつらいよなあ、という気持ちになります」

🔗 parse_floatvalid_float?をRuby 2.7以降向けに最適化

# actionview/lib/action_view/helpers/number_helper.rb#450
        def parse_float(number, raise_error)
          Float(number)
        rescue ArgumentError, TypeError
          raise InvalidNumberError, number if raise_error
          result = Float(number, exception: false)
          raise InvalidNumberError, number if result.nil? && raise_error
        end
# activesupport/lib/active_support/number_helper/number_converter.rb#176
        def valid_float?
          Float(number)
        rescue ArgumentError, TypeError
          false
          Float(number, exception: false)
        end

つっつきボイス:「ActiveSupport::NumberHelper#parse_floatActionView::Helpers::NumberHelper#valid_float?を、例外を投げ直さないようにする形で高速化したのね」「ここで使ったFloat(..., exception: false)はRuby 2.7以降のみと書かれている」「つまりRailsで必要な最小限のRubyバージョンがRails 7で2.7.0以上に変更されることで↓、Ruby 2.7の機能が使えるようになったということでしょうね」「たしかにif RUBY_VERSION的なコードがありませんね」「そういうコードは少ない方がみんなが幸せになれる」

Rails requires Ruby version 2.7.0 or later. It is preferred to use latest Ruby version. If the version number returned is less than that number (such as 2.3.7, or 1.8.7), you'll need to install a fresh copy of Ruby.
edgeguides.rubyonrails.org Getting Started with Railsより

🔗 preload_link_tagを修正


つっつきボイス:「preload_link_tagって使ったことないかも」「ああ、リンクタグにrel="preload"を追加するビューヘルパーなのか」「一部の画像でas="image"が設定されなかったのが修正されたということのようですね👍」

# #Lactionview/test/template/asset_tag_helper_test.rb#248
  PreloadLinkToTag = {
-   %(preload_link_tag '/sprite.svg') => %(<link rel="preload" href="/sprite.svg" as="image" type="image/svg+xml">)
+   %(preload_link_tag '/sprite.svg') => %(<link rel="preload" href="/sprite.svg" as="image" type="image/svg+xml">),
+   %(preload_link_tag '/mb-icon.png') => %(<link rel="preload" href="/mb-icon.png" as="image" type="image/png">)
  }

🔗 schema_cache_ignored_tables設定オプションが追加


つっつきボイス:「特定のテーブルをスキーマキャッシュにダンプしないようにできるオプションが追加されたんですね」「正規表現も使える」「これはどんなときに嬉しいんでしょうか?」「おそらく、Railsのマイグレーションで管理されていない外部データベースを読み込み専用で参照しているような状況で、スキーマがキャッシュされると困るときに欲しい機能でしょうね」「なるほど、ちょうどそういう感じの作業が降ってきたところです😅」「既存の方法でも全テーブル単位とかでダンプをオフにすることはできたと思いますが、コンフィグでより細かく設定できるようにしたということだと思います」「お〜」

  • スキーマキャッシュのダンプ時にテーブルを無視するコンフィグオプションを追加
    アプリケーションがスキーマキャッシュのダンプ時に特定のテーブルを無視するよう設定可能になった。
    この設定オプションは以下のようにテーブルの配列にすることも、正規表現にすることも可能。
config.active_record.schema_cache_ignored_tables = ["ignored_table", "another_ignored_table"]
config.active_record.schema_cache_ignored_tables = [/^_/]

Eileen M. Uchitelle
同Changelogより

🔗 ActiveModel::APIが追加


つっつきボイス:「Alpha 1のコミットの中からたまたま見つけました」「Action PackとAction Viewが参照するModelとして期待するAPI群をActiveModel::APIに切り出すことで、ActiveModel::Modelの見通しを良くしたリファクタリングのようですね」「ActiveModel::API、わかりやすそう」「persisted?はデフォルトでfalseになるのか、へ〜」

# activemodel/lib/active_model/api.rb(ドキュメントは略)
# frozen_string_literal: true

module ActiveModel
  module API
    extend ActiveSupport::Concern
    include ActiveModel::AttributeAssignment
    include ActiveModel::Validations
    include ActiveModel::Conversion

    included do
      extend ActiveModel::Naming
      extend ActiveModel::Translation
    end

    def initialize(attributes = {})
      assign_attributes(attributes) if attributes

      super()
    end

    def persisted?
      false
    end
  end
end

現在のActiveModel::Modelは、Action PackやAction Viewとやりとりするための最低限のAPIとして定義されている。
その名のとおりこれをincludeしてActive Recordモデルを作成できるが、モデル作成機能はごくわずかしかない。たとえばActiveModel::Attributesincludeすることが非常に多い。
ActiveModel::Modelの実装を新たなActiveModel::APIに移動することで、Action PackやAction Viewとやりとりするための最小限のAPI定義を維持できる。
これでActiveModel::ModelにはActiveModel::APIだけがincludeされるようになり、後方互換性を失わずにActiveModel::Modelに機能追加できるようになる。

なお、このプルリクは以前更新しそびれていた古い#42042と同じ。
同PRより

🔗Rails

🔗 iCare Dev Meetup #25開催


つっつきボイス:「昨日(2021/09/15水)開催されたiCare Dev Meetup #25、HotwireやBiTemporal Data Modelの話など、いろいろ充実したイベントでしたね」「イベントやってたの知らなかった...」「毎月開催されていますよ」

以下は#icare_meetup - Twitter検索 / Twitterより。

「早くも動画や資料が公開されていてありがたいです🙏」「いい内容でしたし動画もそれほど長くありませんので視聴をおすすめします👍」

「BiTemporal Data Modelは、適用開始年月日と適用終了年月日を持つデータモデルで、昔からよく取沙汰される話題ですね」

「神速さんのRailsアップグレードの話もよかった: このアップグレード環境を構築するのは大変そうだけど、それを作れればしくみとして回せるようになるんだなと思えました」

「yasaichiさんの資料はしばらくお待ちくださいということですが、動画ではもう見られます」

つっつき後にyasaichiさんの資料が公開されました↓。

「そういえばTwitterもだいぶ前にCassandraを導入しようとして断念したことがありましたね: 新しい技術は一見よさそうに見えても、実際に使ってみるまでわからないところがあるから慎重にならざるを得ない」「ピクスタさんもこれが最終決定ではないそうなのでこれからですね」

参考: Apache Cassandra - Wikipedia
参考: Twitterが、Cassandraの本採用を断念。「いまは切り替えの時期ではない」 - Publickey

「ところで、yasaichiさんの発表はこれより前のバージョンを見た覚えがありますよ: たしか以前の銀座Railsかな」「お、例の『Ruby on Railsの正体と向き合い方』(ウォッチ20190401)とは別でしょうか?」「それではなくて、今回のと近いタイトルだったと思います: こういうふうに同じテーマを定期的に追い続けてくれる方がいると、状況の移り変わりなどもわかってとても助かります🙏」

つっつき後に見つけました↓。

「yasaichiさんの発表を見ていて、必ずしも毎回新しいテーマでなくてもいいんだなって思ったので、機会があったらまたデータベースVIEWの話をしてもっと啓蒙してみようかな」「データベースVIEWは以前銀座Rails#10で発表していましたね↓」「3年経ったからそろそろ頃合いかも」

RDBMSのVIEWを使ってRailsのデータアクセスをいい感じにする【銀座Rails#10】

「ところで自分は聞いたことはありませんが、yasaichiさんの発表内容はこちらのtextafmポッドキャスト↓を普段から聞いていた人にはお馴染みだったようです」「そうそう、こうやっていろんな形で普及に努めているんだなって思いました」

🔗 その他Rails


つっつきボイス:「Railsクイズ、皆さんもぜひやってみるとよいと思います👍: 自分たちが普段やっていることなら見当がつくけど、2番のような、既にプロファイルが存在するのにuser.build_profileするという普段まずやらないような問題は難しかった」

🔗Ruby

🔗 ハッシュのショートハンド記法

参考: Shorthand hash syntax in Ruby - rubyonrails-talk - Ruby on Rails Discussions


つっつきボイス:「そうそう、RubyKaigi Takeout 2021最終日の感想戦でES2015風のハッシュのショートハンド記法をRuby 3.1に追加する話が出ていましたね」「結局マージされたんでしたっけ?」「c60dbcdでマージされていました」「お〜、割と前から要望があった構文ですけど、RubyKaigiの勢いに乗ってマージされたんでしょうね」

参考: Allow value omission in Hash literals · ruby/ruby@c60dbcd

参考: オブジェクト初期化子 - JavaScript | MDN

// developer.mozilla.orgより
// Shorthand property names (ES2015)
var a = 'foo', b = 42, c = {};
var o = {a, b, c};

RubyKaigi Takeout 2021のスライド(Day3)

「TechRacho翻訳記事でお世話になっているBrandon Weaverさんが早くもこの新構文で遊んでみた記事をアップしていました↓」


今回は以上です。

バックナンバー(2021年度第3四半期)

週刊Railsウォッチ: 責任あるモンキーパッチの当て方、gem脆弱性スキャンツール、Docker Desktop課金プラン改定ほか(20210907後編)

今週の主なニュースソース

ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。

Rails公式ニュース


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。