- Ruby / Rails関連
週刊Railsウォッチ(20191223前編)Railsセキュリティ修正6.0.2.1と5.2.4.1リリース、Ruby 2.7.0-rc2リリース、ActiveRecordのコールバック回避ほか
こんにちは、hachi8833です。今年最後のRailsウォッチ前編をお送りします。Ruby 2.7のカウントダウンが始まっていますので、クリスマスにはリリースされるでしょう。
- リリース: Ruby 2.7.0-rc1 Released
で、rc1を試したいけど、Homebrewのruby-buildにはなかなか最新版が上がってこないから、まだインストールできない〜!というときに読むQiita記事を書きました。
Homebrewのruby-buildの更新を待たずにrbenvで最新版のRubyをインストールする方法 - Qiita https://t.co/UpYp2fkLGE
— Junichi Ito (伊藤淳一) (@jnchito) December 18, 2019
その後21日にrc2がリリースされました。
- リリース: Ruby 2.7.0-rc2 Released
- 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
- 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です👄
- 毎月第一木曜日に「公開つっつき会」を開催しています: お気軽にご応募ください
⚓お知らせ: 週刊Railsウォッチ「第18回公開つっつき会」(無料)
第18回目公開つっつき会は、来年1月09日(木)19:30〜にBPS会議スペースにて開催されます。今回から会場のPubスペースが隣の部屋に移ります。
週刊Railsウォッチの記事やここだけの話にいち早く触れられるチャンス!発言・質問も自由です。皆さまのお気軽なご参加をお待ちしております🙇。
⚓臨時ニュース: Railsセキュリティ修正6.0.2.1と5.2.4.1がリリース
- リリース: Rails 6.0.2.1 has been released! | Riding Rails
- commit: Fix possible information leak / session hijacking vulnerability. · rails/rails@ad2da1a
- リリース: Rails 5.2.4.1 has been released! | Riding Rails
- commit: Fix possible information leak / session hijacking vulnerability. · rails/rails@2a52a38
Rackで情報漏えい/セッションハイジャックの脆弱性が見つかったとのことです。どちらもRackのバージョンアップとAction Packのみの修正です。
ActionDispatch::Session::MemcacheStore
がまだ脆弱なので、dalli gemもアップデートが必須。
Changelogより大意
オレオレアプリは対応しました。
追記(2019/12/24): 上記セキュリティ修正でredis-storeがエラーになる可能性
redis-storeをお使いの方は、本件が解決するまでセキュリティアップデートを待つ必要がありそうです。
なお、同issueのコメントではredis-storeの修正で解決できると追記されていますが、現時点ではまだredis-storeにマージされていません。
⚓Rails: 先週の改修(Rails公式ニュースより)
お詫び: 今回の録画に音声が入っていなかったため、最小限のつっつきボイスとなっています🙇🙇。
以下から見繕いました。
⚓delegate
がRuby 2.7の...
記法に対応
# activesupport/lib/active_support/core_ext/module/delegation.rb#L202
- definition = /[^\]]=$/.match?(method) ? "arg" : "*args, &block"
+ definition = if /[^\]]=$/.match?(method)
+ "arg"
+ elsif RUBY_VERSION >= "2.7"
+ "..."
+ else
+ "*args, &block"
+ end
以下は先週も貼りましたが一応。
参考: Ruby 2.7 の変更点 - 「...」で全引数渡し - @tmtms のメモ
参考: Ruby 2.7 adds shorthand syntax for arguments forwarding – Saeloun Blog
つっつきボイス:「...
はRuby 2.7の新機能か😳」「"*args, &block"
と同等なんですね」
⚓bundle exec ruby
でテストを実行できるよう修正
require: cannot load such file -- abstract_unit (LoadError)
のようなエラーはRailsが初めての人にとってうれしくないので、いい感じにシンプルにした。またテストの依存関係も明確になり、サブフォルダでテストを実行できるようにもなった。
同PRより大意
つっつきボイス:「Railsに慣れていない人がくじけないようにとのことです」「修正ファイル144個は多いな〜😆」「修正されたissue #34025↓を見るとbundle exec ruby test/cache/stores/mem_cache_store_test.rb
って実行してエラーになってたけど、こんなふうに実行したことないし😆」
⚓yearが未定義の場合の扱いを修正
# actionview/lib/action_view/helpers/date_helper.rb#L832
def select_year
- if !2019/12/23time || 2019/12/23time == 0
+ if !year || 2019/12/23time == 0
val = "1"
middle_year = Date.today.year
else
val = middle_year = year
end
if @options[:use_hidden] || @options[:discard_year]
build_hidden(:year, val)
else
options = {}
options[:start] = @options[:start_year] || middle_year - 5
options[:end] = @options[:end_year] || middle_year + 5
options[:step] = options[:start] < options[:end] ? 1 : -1 options[:leading_zeros] = false options[:max_years_allowed] = @options[:max_years_allowed] || 1000 if (options[:end] - options[:start]).abs > options[:max_years_allowed]
raise ArgumentError, "There are too many years options to be built. Are you sure you haven't mistyped something? You can provide the :max_years_allowed parameter."
end
build_select(:year, build_year_options(val, options))
end
end
つっつきボイス:「yearが定義されていない場合今までエラーになってたのね😳」「テストを見るとわかりやすいかも↓」
# actionview/test/template/date_helper_test.rb#473
def test_select_year_with_empty_hash_value_and_no_start_year
expected = +%(<select name="date[year]">\n)
</select>
<select name="date[year]">expected << %(
<option value="2014">2014</option>\n
<option value="2015">2015</option>\n
<option value="2016">2016</option>\n
<option value="2017">2017</option>\n
<option value="2018">2018</option>\n)
</select>
<select id="date_year" name="date[year]">expected << "
</select>\n"
Date.stub(:current, Date.new(2018, 12, 18)) do
assert_dom_equal expected, select_year({ year: nil, month: 4, day: nil }, { end_year: 2018 })
end
end
⚓マイグレーションのremove_columns
をリバーシブルに
remove
でtype:
を書いておけばリバースできるようになるそうです。
# 同PRより
class InvertibleChangeTableMigration < SilentMigration
def change
change_table("horses") do |t|
t.column :name, :string
t.remove :remind_at, type: :datetime
end
end
end
つっつきボイス:「マイグレーションのchange
にremove
を書けるようになったそうです」「自分は使わないかな〜😆」
⚓番外: 細かな修正
- PR: unify puma types and remove blocks by grosser · Pull Request #28499 · rails/rails -- とてもささやかなプルリクですが、何と2017年のでした
- PR: Update ActionText docs [ci skip] by jackkinsella · Pull Request #38020 · rails/rails
- commit: Documents another gotcha of classic autoloading [skip ci] · rails/rails@fe3db2a -- 古いオートローダーのガイドの更新
# railties/lib/rails/generators/rails/app/templates/config/puma.rb#L7
-threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }
+threads_count = Integer(ENV.fetch("RAILS_MAX_THREADS", "5"))
threads threads_count, threads_count
つっつきボイス:「#28499は↑今までブロック渡しだったのを引数に変えた」「#38020はAction Textのドキュメントに補足↓」「そういえばWebpacker関連の記述って今のRailsガイドにほとんどありませんね😆」「WIPなガイドは他にもありますし☺️」
# guides/source/action_text_overview.md#L47
-Run `rails action_text:install` to add the Yarn package and copy over the necessary migration.
-Also, you need to set up Active Storage for embedded images and other attachments.
-Please refer to the [Active Storage Overview](active_storage_overview.html) guide.
+Run `rails action_text:install` to add the Yarn package and copy over the necessary migration. Also, you need to set up Active Storage for embedded images and other attachments. Please refer to the [Active Storage Overview](active_storage_overview.html) guide.
+
+After the installation is complete, a Rails app using Webpacker should have the following changes:
+
+1. Both `trix` and `@rails/actiontext` should be required in your JavaScript pack.
+
+```js
+// application.js
+require("trix")
+require("@rails/actiontext")
+```
+
+2. The`trix` stylesheet should be imported into `actiontext.scss`.
+
+```scss
+@import "trix/dist/trix";
+```
+
+Additionally this `actiontext.scss` file should be imported into your stylesheet pack.
+
+```
+// application.scss
+@import "./actiontext.scss";
+```
⚓Rails
⚓RailsとDDD
RailsはActiveRecordが密結合で実現しているためDDDのモデリングの考え方と相性が悪く、レイヤードアーキテクチャをやろうとすると型がないことなどDDDの考え方が適応しにくい
同記事より
つっつきボイス:「上みたいな記事を割と見かけるんですがやっぱり難しいんでしょうか?」「RailsでDDDをやるのは簡単ではありませんね🧐: Active Recordモデルを永続化に専念させるとか、いろいろやらないといけなくなりますし」「そうでしたか...RailsとDDDの記事は新しいのが少ないのはそういう事情があるのかも?🤔」「どうしてもやりたいならHanamiとかにする方がいいんじゃね?😆」
参考: Rails 歴5年の僕が Laravel で開発するようになって思ったこと。|Kurashicom Engineers' Blog|note
⚓Active Recordのコールバックを回避(Ruby Weeklyより)
Active Recordのコールバックにビジネスロジックを実装すべきでないと強く信じている。
同記事より抜粋
# 同記事より
class Address
attr_accessor :disable_geolocation
before_save :set_geolation, unless: :disable_geolocation
private
def set_geolocation
# Hit some API or something...
end
end
つっつきボイス:「disable_geolocation
がtrueならコールバックしないようにしてる」「そういえば銀座Rails#15でもコールバック消し去りたい話が出てたのを見た覚えがあったんですが、この辺のツイートにあったのをやっと見つけました↓」「kamipoさんとyahondaさんの対談ですね☺️」
- Togetter: 銀座Rails#15まとめ (5ページ目) - Togetter
kamipoさん「scopeはつかってほしくない、deprecatedにしたい」 #ginzarails
— 森塚 真年@エンペイ (@sanfrecce_osaka) November 15, 2019
「とりあえず言っておきたいのは、コールバックとconcernsは相性が悪い」「あぁ!」
「そういえばkazzさんはコントローラのbefore_action
コールバックは例外的に好きって言ってました」「コントローラのbefore_action
も気をつけないとカオスになりますよ💀」「うぅ😢」
⚓RubyConf 2019@Nashvilleまとめ
つっつきボイス:「手描きのまとめが素敵だなと思って❤️」「でも他の人が読むにはつらいという😆」
⚓その他Rails
少なくともWebアプリ開発をする上で、RailsとReactとTerraformとスクラム開発が分かれば、有能な駒の部類だという自信はある。飛車角には及ばないけど、金銀くらいには…。
— 神速 (@sinsoku_listy) December 17, 2019
つっつきボイス:「RailsとReactとTerraformとスクラム開発やれたらマジ有能」
TokyoGirls.rb Meetup vol.2での発表について、資料が膨大な量になってしまい、苦肉の策としてRackの解説を削って別資料に分離しましたので、事前共有します💁
はてRackとは…?という参加者の方に読んで頂けると幸いです🙏(あるいは技術的指摘を下さい…) https://t.co/ZjTdNjlhot#tokyogirlsrb— Misaki Shioi (しおい) (@coe401_) December 15, 2019
つっつきボイス:「Rackは思ったより難しくないし記事も多いので、どんどん作って動かしてみるのがいいと思います😋」
参考: 海外記事翻訳シリーズ 【第 2 回】 Rack 仕様
参考: Rails と Rack - Railsガイド
参考: 第23回 Rackとは何か(1)Rackの生まれた背景:Ruby Freaks Lounge|gihyo.jp … 技術評論社
前編は以上です。
おたより発掘
DDDやりたければhanamiつかお?はわかる https://t.co/v3eOXueNr2
— すろっくさん (@srockstyle) December 23, 2019
バックナンバー(2019年度第4四半期)
週刊Railsウォッチ(20191217後編)Ruby 2.7の変更点とパターンマッチング、依存性自動アップデートツール、Stack Overflowアンケート2019ほか
- 20191210後編 Ruby 2.7の変更点記事、mrubyで動くmitamae、画像系コラボレーションツールほか
- 20191209前編 Pumaのphased-restartとUnicornのgraceful restart、RailsのTZハックが不要になった話ほか
- 20191204後編 Rubyコードをトランスパイルするruby-next、Cloud Run正式リリース、2019年Web年鑑レポート、V言語ほか
- 20191202前編 Rails 6のimplicit_order_columnはカスタマイズ可能、rubocop-rails 2.4.0リリース、Capistrano記事ほか
- 20191119後編 メソッド参照演算子が廃止、GitHub新機能続々、平成Ruby会議、GitHub OAuthバイパスほか
- 20191118前編 ActiveJob引数のログ抑制、RailsガイドProプランお試し、ファイルアップロードのレジュームgemほか
- 20191112後編 invisible gemで可視性を変えずにパッチ当て、スライド:「型なし言語のための型」、自然言語の言語名を推測ほか
- 20191111前編 Active Recordモデルをprivateで封じ込める、心折れないRailsスキーマ管理、Railsセッションをクロスドメイン共有ほか
- 20191106後編 holiday_japan gemで日本の祝日判定、小さい関数が有害になるとき、Gitブランチのファジー検索ほか
- 20191105前編 Rails 6のデフォルト設定解説、DHHも消したいaccepts_nested_attributes_for、スライド『実践Railsアプリケーション設計』ほか
- 20191029後編 Ruby 2.7.0-preview2、tapping_device gemとhumanize gem、平成Ruby会議ほか
- 20191028前編 RailsにSTI用メソッドsti_class_forとpolymorphic_class_forが追加、RuboCopを変更箇所だけにかけるgem、strftime書式生成サイトほか
- 20191021 Rails 6でhas_many関連の修正やSprockets 4.0対応、Shrine 3.0がリリース、Minitestスタイルガイドほか
- 20191015 スライド「Rails Performance issues and Solutions」を見る、dirtyに*_previously_was が追加、Sidekiq 6.0.1ほか
- 20191008後編 Ruby 2.7のInteger#[]でバイナリチェック、rubyzip gemは強力、13KBのJavaScriptゲームほか
- 20191001後編 RedisとRubyをつなぐredis-object gem、Fullstaq Rubyの新バージョン、COUNT(*)とCOUNT(1)の速度ほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp Slackなど)です。