週刊Railsウォッチ(20180820)Railsで構築されたサイト40選、Deviseはつらいよ、ARのスコープとクラスメソッドの使い分けほか

こんにちは、hachi8833です。Matzにっきを最初から読みふけってたら完璧に寝不足になってしまいました。 つっつきボイス:「お、例のMatzにっき、この間404になってなかったっけ?」「その後復旧してました: ここのtDiaryのナビゲーションがつらくて、最も最初の月にたどり着くのに何回もクリックしないといけなかったり😭」「😆」「最初が2003年なのでまだRailsも世に登場してなかった頃でした」 スクレイピングしてローカルで読もうかとも思いましたが負荷かけるのがコワイので、ブラウザで月ごとに気長にSave asし始めてます🐢。 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ 「つっつきボイス」はRailsウォッチ公開前ドラフトを社内有志でつっついたときの会話です👄 ⚓お知らせ: 第2回「週刊Railsウォッチ 公開つっつき会」開催 お申込み: 週刊Railsウォッチ 公開つっつき会 第2回|IT勉強会ならTECH PLAY[テックプレイ] 初回の8/2に続き、「週刊Railsウォッチ 公開つっつき会 第2回」を9月6日(木)19:30〜より開催いたします。詳しくは上のリンクでご覧ください。皆さまのご参加をお待ちしております🙇🙇。 もりもりさんこないだ会ったけど、すごくわかりやすい説明と話し方をしてくれる方だった。 https://t.co/Z9h6JwtU2Q — すろっくさん@10キロ痩せたぞ (@srockstyle) August 14, 2018 ⚓Rails: 先週の改修(Rails公式ニュースより) ⚓ActiveStorageのエラーハンドリングを改善 PR: Improve ActiveStorage service adapter error handling by joeltaylor · Pull Request #33540 · rails/rails issue #33157の方がわかりやすいかも? わかりにくかったエラー NameError: Cannot load Rails.config.active_storage.service: wrong constant name diskService #33157より # activestorage/lib/active_storage/service/configurator.rb#L27 def resolve(class_name) – require “active_storage/service/#{class_name.to_s.underscore}_service” + ActiveStorage::Service.const_get(:”#{class_name}Service”) + ActiveStorage::Service.const_get(:”#{class_name.classify}Service”) + rescue LoadError + raise “Missing service adapter for #{class_name.inspect}” end つっつきボイス:「”#{class_name}Service”が”#{class_name.classify}Service”に…?🤔あー大文字小文字をクラス名のスタイルにするメソッドか」「言葉どおりの『分類』ではなかったんですね💦」 参考: Ruby on Rails 5.2 / ActiveSupport::Inflector#classify — DevDocs # devdocs.ioより classify(‘ham_and_eggs’) # => “HamAndEgg” classify(‘posts’) # => “Post” ⚓キャッシュのフェッチでnilをスキップするようになった PR: Support skip nil for cache fetch by Martin91 · Pull Request #25437 · rails/rails # activesupport/lib/active_support/cache.rb#L701 def save_block_result_to_cache(name, options) result = instrument(:generate, name, options) do yield(name) end – write(name, result, options) + write(name, result, options) unless result.nil? && options[:skip_nil] result end つっつきボイス:「今までは結果がnilの場合もキャッシュに保存されて、キャッシュがexpireするまで残っちゃってたのか💡」「で、今後はskip_nil: trueというオプションを指定すれば、結果がnilの場合はキャッシュしないようになると👍: わかりみ」 追記: 従来のコードでは、例えば「最新データがキャッシュにあればキャッシュから拾い、なければDBを参照する」みたいな動作を期待している時に一度nilをキャッシュしてしまうと、DBに新しいデータが入ってもキャッシュがexpireするまでnilを返してしまう仕様でした。 ただ、これはキャッシュエンジンの仕様としてはあながち間違いではありません。DB側を更新する時に明示的に対応キーのキャッシュを飛ばす実装にすればそれでも正しく動くからです。 今回の変更の:skip_nil`オプションは、その辺のキャッシュ自動管理を多少サボれるようになります。一度作られたら変わらないデータみたいなものをキャッシュに載せる場合には手軽に使えて便利という感じです。 ただし楽になるのは新規追加の時だけで、updateの場合には結局手動でキャッシュ飛ばすコードが必要です。この設定が手動で必要なことを見落とすと、古いデータが更新されないというIssueが上がってくる所までがワンセットになりそうな予感がします。 ⚓ネストした属性でextendしたときにbuildが呼ばれるように修正 PR: Call build when extend with nested attributes defined by azbshiri · Pull Request #33454 · rails/rails これもissue #33389の方がわかりやすいかも。 # activerecord/lib/active_record/nested_attributes.rb#L503 unless reject_new_record?(association_name, attributes) – association.build(attributes.except(*UNASSIGNABLE_KEYS)) + association.reader.build(attributes.except(*UNASSIGNABLE_KEYS)) end … Continue reading 週刊Railsウォッチ(20180820)Railsで構築されたサイト40選、Deviseはつらいよ、ARのスコープとクラスメソッドの使い分けほか