- Ruby / Rails関連
週刊Railsウォッチ: Rails 7 Alpha 1と2が公開、Rubyハッシュのショートハンド記法、iCare Dev Meetupほか(20210921)
こんにちは、hachi8833です。RubyKaigi Takeout 2021が終わりましたね。
私はいつもproposalでの推しポイントは「これRubyKaigiじゃなかったらどこで話すん?」だけなので、なんかスケジュールが結果的にこうなってて #rubykaigi すごいなー、と毎回おもう
— Kakutani Shintaro (@kakutani) September 11, 2021
今週の週刊Railsウォッチは祝日が多いので短縮版でお送りします。また、来週の週刊Railsウォッチはお休みいたします🙇
🔗 特集: Rails 7 Alpha 1と2がリリース
Rails 7.0の足音が聞こえてきた……!!
Rails 7.0 Alpha 1: New JavaScript Answers, At-Work Encryption, Query Origin Logging, Zeitwerk Exclusively | Riding Rails https://t.co/Bm95rnjrIZ
— Junichi Ito (伊藤淳一) (@jnchito) September 15, 2021
なおつっつきの後で、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を速攻で外したりすることもありましたよね」
「Railsも成熟したんだなという気持ち」「Webpackも使いたければ使っていいよというのはありがたい🙏」「そういえば最近はリリースノートでも言及されているesbuildがいいらしいという噂もちらほら見かけますね」
以下はつっつき後に見つけたツイートです。
esbuild、トップに貼ってあるグラフが強すぎるんだよなhttps://t.co/mSd5WJibtv pic.twitter.com/p1TaCzV2Uj
— syumai (@__syumai) February 24, 2021
「リリースノートにはこれまでチェックしてきた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)」
- 現時点のアップグレードガイド rails/upgrading_ruby_on_rails.md at main · rails/rails
🔗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はこれまでサーバーサイドでアセットプリコンパイルするという考え方でしたね」「それが今回デフォルトからは消えたということか」「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_float
とvalid_float?
をRuby 2.7以降向けに最適化
- PR: Avoid use of exceptions to detect invalid floats by flavorjones · Pull Request #43106 · rails/rails
# 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_float
やActionView::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
設定オプションが追加
- PR: Add ability to ignore tables in the schema cache by eileencodes · Pull Request #43075 · rails/rails
つっつきボイス:「特定のテーブルをスキーマキャッシュにダンプしないようにできるオプションが追加されたんですね」「正規表現も使える」「これはどんなときに嬉しいんでしょうか?」「おそらく、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::Attributes
もinclude
することが非常に多い。
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より。
「早くも動画や資料が公開されていてありがたいです🙏」「いい内容でしたし動画もそれほど長くありませんので視聴をおすすめします👍」
@j5ik2o
iCAREのdevチームです!
お待たせをいたしました、Youtubeにアーカイブ動画をアップロードしましたので宜しければご覧くださいませ🙏順次、切り抜き動画もアップロードしていきますので、お楽しみにしていただければ幸いです!https://t.co/i5oYWdWpHd
— iCARE DEVチーム (@devteamicare) September 16, 2021
「BiTemporal Data Modelは、適用開始年月日と適用終了年月日を持つデータモデルで、昔からよく取沙汰される話題ですね」
データ履歴管理のための RDB 設計について。バイテンポラルデータモデル、俺の親父の必殺技だ(名前がついていたのか) / “JJUG CCC 2017 Springで論理削除フラグをどうにかするための話をしてきました 【FOLI…” https://t.co/xmh7PvKxsY
— Takuto Wada (@t_wada) May 22, 2017
今度触ってみよ https://t.co/OiwvqL2czA #icare_meetup
— Kyohei Nanba (@kyo_nanba) September 15, 2021
「神速さんのRailsアップグレードの話もよかった: このアップグレード環境を構築するのは大変そうだけど、それを作れればしくみとして回せるようになるんだなと思えました」
資料を公開したhttps://t.co/FtK78A6zc2 #icare_meetup
— 神速 (@sinsoku_listy) September 15, 2021
「yasaichiさんの資料はしばらくお待ちくださいということですが、動画ではもう見られます」
つっつき後にyasaichiさんの資料が公開されました↓。
昨日 #icare_meetup で登壇した際の資料を公開しました。2つのORM(RailsのActive RecordとPrisma)を切り口に、ピクスタのCTOとしてビジネス上の問題を解決するために行った技術選定と今後の取り組みについて話しました / Active Recordから考える次の10年を見据えた技術選定 https://t.co/nuQdpBqmOu
— (やさいち|yasaichi) (@_yasaichi) September 16, 2021
「そういえばTwitterもだいぶ前にCassandraを導入しようとして断念したことがありましたね: 新しい技術は一見よさそうに見えても、実際に使ってみるまでわからないところがあるから慎重にならざるを得ない」「ピクスタさんもこれが最終決定ではないそうなのでこれからですね」
参考: Apache Cassandra - Wikipedia
参考: Twitterが、Cassandraの本採用を断念。「いまは切り替えの時期ではない」 - Publickey
「ところで、yasaichiさんの発表はこれより前のバージョンを見た覚えがありますよ: たしか以前の銀座Railsかな」「お、例の『Ruby on Railsの正体と向き合い方』(ウォッチ20190401)とは別でしょうか?」「それではなくて、今回のと近いタイトルだったと思います: こういうふうに同じテーマを定期的に追い続けてくれる方がいると、状況の移り変わりなどもわかってとても助かります🙏」
つっつき後に見つけました↓。
先ほど #ginzarails で発表した際の資料を公開しました。Active RecordがRailsの生産性にどう寄与しているのか、これがJavaScriptの新興フルスタックフレームワークでも再現可能なのかについて、私見を述べました。 / Active Recordから考える次世代のRuby on Railsの方向性 https://t.co/zGE9Eyb29c
— (やさいち|yasaichi) (@_yasaichi) January 29, 2021
「yasaichiさんの発表を見ていて、必ずしも毎回新しいテーマでなくてもいいんだなって思ったので、機会があったらまたデータベースVIEWの話をしてもっと啓蒙してみようかな」「データベースVIEWは以前銀座Rails#10で発表していましたね↓」「3年経ったからそろそろ頃合いかも」
「ところで自分は聞いたことはありませんが、yasaichiさんの発表内容はこちらのtextafmポッドキャスト↓を普段から聞いていた人にはお馴染みだったようです」「そうそう、こうやっていろんな形で普及に努めているんだなって思いました」
後援者 @_yasaichi がホストで私がゲストのポッドキャスト #textafm もぜひよろしくお願いします! https://t.co/KeENcQrgeX #icare_meetup
— Takuto Wada (@t_wada) September 15, 2021
🔗 その他Rails
SmartHRさんのテックブログに寄稿しました。読んだ人何問正解したか教えて下さい(\( ⁰⊖⁰)/) https://t.co/EoJatGTtMz
— willnet (@netwillnet) September 16, 2021
つっつきボイス:「Railsクイズ、皆さんもぜひやってみるとよいと思います👍: 自分たちが普段やっていることなら見当がつくけど、2番のような、既にプロファイルが存在するのにuser.build_profile
するという普段まずやらないような問題は難しかった」
🔗Ruby
🔗 ハッシュのショートハンド記法
まつもとさんの気が変わる前にコミットしました #rubykaigi https://t.co/hu1fAHBWZl
— Shugo Maeda (@shugomaeda) September 11, 2021
参考: 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};
「TechRacho翻訳記事でお世話になっているBrandon Weaverさんが早くもこの新構文で遊んでみた記事をアップしていました↓」
“Ruby 3.1 – Shorthand Hash Syntax – First Impressions - DEV Community” https://t.co/mQ0doNrLRX
— Watson (@watson1978) September 12, 2021
今回は以上です。
バックナンバー(2021年度第3四半期)
週刊Railsウォッチ: 責任あるモンキーパッチの当て方、gem脆弱性スキャンツール、Docker Desktop課金プラン改定ほか(20210907後編)
- 20210906前編 ActiveRecord::QueryLogs追加、spring gemがデフォルトから削除、fast_gettextほか
- 20210901後編 TruffleRubyでdig_fetchを実装、ruby/debug gem、AWSハンズオン教材ほか
- 20210830前編 Rails 7でのimport maps導入、Steepで型を導入、KubernetesでRailsを動かすためのガイドほか
- 20210823後編 SorbetのRuby AOTコンパイラが公開、「Compiler Explorer」にRubyが追加、Ractorで非同期通信ほか
- 20210818前編 カウンタキャッシュをスレッドセーフに更新、Journey::Ast追加、GitLabをAWS Graviton2で動かすほか
- 20210810 システムテスト用headlessドライバにCupriteが追加、rails-mini-profiler、Jeremy Evansインタビューほか
- 20210804後編 Rubyの可変長アロケーションプロジェクト、サーキットブレーカーgem、EC2-Classicが終了へほか
- 20210803前編 SorbetでRailsアプリの型シグネチャを書く、activerecord-cte gemとanycable-client gem
- 20210720後編 ruby-gitでGit操作、最近のruby/debug、stdgems.org、Windows 365 Cloud PCほか
- 20210719前編 GitHubによるdisable_joins解説、MemoWise gemでメモ化、RailsのDDoS攻撃対策ほか
- 20210713後編 ruby-spacyで自然言語処理、Ruby製x86-64アセンブラ、『タイムゾーン呪いの書』ほか
- 20210712前編 AR::Relation#destroy_allがバッチ分割に変更、Active Record暗号化解説、sidekiq-unique-jobsほか
- 20210706後編 GitHub CopilotのAI補完、Pure Ruby実装のRuby JIT rhizome、PostgreSQLのPG-Strom拡張ほか
- 20210705前編 DI的な書き方が必要なとき、脆弱性学習用アプリRailsGoat、brakemanは優秀ほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。
週刊Railsウォッチについて
TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)