Ruby

新しいItemの作成

Items

最新コメント

params.expectで配列のパラメータを許可するには明示的に二重の角括弧([[ :属性名 ]])が必要

wakairo @wakairo
最終更新

ちなみに、RuboCopにrequirepermitの組み合わせからexpectへの書き換えを自動でやってもらうことは可能ですが、配列パラメータの許可に関してはRuboCopが自動書き換えに失敗する場合があります。

その理由は以下の記述は、配列のパラメータも配列でないパラメータも許可してしまうため、RuboCopとしては配列なのかそうでないのかの判定が機械的に行えないためであると考えられます。

permit(user: [:name])

より詳しくは、前述の記事のこちらの箇所を参照ください。

0
Raw
https://www.techtips.page/ja/comments/843

params.expectで配列のパラメータを許可するには明示的に二重の角括弧([[ :属性名 ]])が必要

wakairo @wakairo

Rails8では、requirepermitに代わるより安全な新しいメソッドとして、strong parametersへexpectが導入されました。

expectでは、安全面への配慮から、配列のパラメータを指定する方法がpermitに比べ厳格化されています。 具体的には、配列のパラメータを許可するには明示的に二重の角括弧([[ :属性名 ]])が必要となりました。

配列のパラメータを許可する具体的な方法(引用元: expectのAPIドキュメント)は以下の通りです。

params = ActionController::Parameters.new(comments: [{ text: "hello" }, { text: "world" }])
params.expect(comments: [[:text]])
# => [#<ActionController::Parameters { "text" => "hello" } permitted: true>,
#     #<ActionController::Parameters { "text" => "world" } permitted: true>]

なお、安全のためにexpectがこの二重の括弧の記法を採用した背景については、Rails 8: strong parametersの新しいparams.expectの使い方(翻訳)を参照ください。

0
Raw
https://www.techtips.page/ja/comments/842

Solid Queueとアプリで同じDBを使う時の注意点と設定

wakairo @wakairo
最終更新

公式READMEでは、Solid Queueとアプリで同じデータベースを利用することは可能だがいくつか注意点があると記されており、問題をさけるための設定として以下が紹介されています。

class ApplicationJob < ActiveJob::Base
  self.enqueue_after_transaction_commit = true
end

また、インストールにおいても単一データベース用にいくつか作業が必要になります

なお、本件に関する日本語情報としては、Rails Guidesの日本語版に概要の記述があります。

0
Raw
https://www.techtips.page/ja/comments/776
😄1
🔧1

rails 7.2からrails 8.0への移行(アップデート、アップグレード)で必要な作業

wakairo @wakairo

Rails 8.0におけるlogger

config.loggerは、Railsアプリで用いるロガーの設定です。

rails newで生成されるconfig/environments/production.rbにおいて、 8.0からこの設定について以下の変更が行われました(この変更のPRその1PRその2)。この変更により、Kamralを用いたproduction環境ではタイムスタンプが二重に表示されなくなります。

-  # Log to STDOUT by default
-  config.logger = ActiveSupport::Logger.new(STDOUT)
-    .tap  { |logger| logger.formatter = Logger::Formatter.new }
-    .then { |logger| ActiveSupport::TaggedLogging.new(logger) }
-
-  # Prepend all log lines with the following tags.
+  # Log to STDOUT with the current request id as a default log tag.
   config.log_tags = [ :request_id ]
+  config.logger   = ActiveSupport::TaggedLogging.logger(STDOUT)

既存アプリでも、production環境でタイムスタンプが二重になっている場合には、この変更を行ってタイムスタンプが1つになるようにすると良いかもしれません。

0
Raw
https://www.techtips.page/ja/comments/663
❤️1

rails 7.2からrails 8.0への移行(アップデート、アップグレード)で必要な作業

wakairo @wakairo

Rails 8.0におけるactive_record.attributes_for_inspect

config.active_record.attributes_for_inspectは、Active Recordオブジェクトのinspectに関わる設定です。

rails newで生成されるconfig/environments/production.rbにおいて、 8.0からこの設定を行う以下のコードが追加されました(この変更のPR)。このコードの追加により、production環境ではinspectの結果に基本的にidのみが含まれるようになります。

  # Only use :id for inspections in production.
  config.active_record.attributes_for_inspect = [ :id ]

この設定はproduction環境でのパフォーマンスの悪化をさけるための変更に端を発していますので、既存アプリでもこのコードを追加すると良いかもしれません。

0
Raw
https://www.techtips.page/ja/comments/662

rails 7.2からrails 8.0への移行(アップデート、アップグレード)で必要な作業

wakairo @wakairo
最終更新

Rails 8.0におけるaction_mailer.perform_caching

config.action_mailer.perform_cachingは、メーラーテンプレートでフラグメントキャッシングを行うかどうかの設定です。

rails newで生成されるconfig/environments/production.rbにおいて、 8.0からは以下のようにこの設定を行うコードが削除されました(この変更のPRこの変更のCommit)。このキャッシングを無効にするコードの削除により、メーラーテンプレートでのフラグメントキャッシングが有効になります。

-  # Disable caching for Action Mailer templates even if Action Controller
-  # caching is enabled.
-  config.action_mailer.perform_caching = false

既存アプリでもメーラーテンプレートでのフラグメントキャッシングを有効にしたい場合は、このコードの削除により可能です。

0
Raw
https://www.techtips.page/ja/comments/661

rails 7.2からrails 8.0への移行(アップデート、アップグレード)で必要な作業

wakairo @wakairo
最終更新

Rails 8.0におけるsilence_healthcheck_path

config.silence_healthcheck_pathは、ログ出力を抑制すべきヘルスチェックのパスを指定する設定です。

rails newで生成されるconfig/environments/production.rbにおいて、 8.0からは以下のようにこの設定を行うコードが追加されました(この変更のPRこの変更のCommit)。

  # Prevent health checks from clogging up the logs.
  config.silence_healthcheck_path = "/up"

ヘルスチェックでログが詰まる問題が起きている場合や見やすさなどの理由でヘルスチェックのログを抑制をしたい場合は既存アプリでも同じ設定変更、つまり、設定の追加をしても良いかもしれません。

0
Raw
https://www.techtips.page/ja/comments/660

rails 7.2からrails 8.0への移行(アップデート、アップグレード)で必要な作業

wakairo @wakairo
最終更新

Rails 8.0におけるpublic_file_server.headersとassume_ssl

rails newで生成されるconfig/environments/production.rbにおいて、 8.0からは以下の設定2つが追加されているのですが(この変更のPRこの変更のCommit)、 これは8.0からrails newで生成されるアプリでKamal 2対応が行われていることに起因するものです。

+  # Cache assets for far-future expiry since they are all digest stamped.
+  config.public_file_server.headers = { "cache-control" => "public, max-age=#{1.year.to_i}" }
   # Assume all access to the app is happening through a SSL-terminating reverse proxy.
-  # Can be used together with config.force_ssl for Strict-Transport-Security and secure cookies.
-  # config.assume_ssl = true
+  config.assume_ssl = true

ですので既存アプリでは、Kamal 2対応をしないのであればこれらの設定の追加はしなくても良いと思われます。

0
Raw
https://www.techtips.page/ja/comments/659

rails 7.2からrails 8.0への移行(アップデート、アップグレード)で必要な作業

wakairo @wakairo

Rails 8.0におけるassets.compile

config.assets.compileは、動的なSprocketsコンパイルを有効にするかどうかの設定です。

rails newで生成されるconfig/environments/production.rbにおいて、 8.0からは以下のようにこの設定が削除されているのですが(この変更のPRこの変更のCommit)、 これは8.0からrails newで生成されるアプリのアセットパイプラインのデフォルトがPropshaftになったことに起因するものです。

-  # Do not fall back to assets pipeline if a precompiled asset is missed.
-  config.assets.compile = false

ですので既存アプリは、Propshaftへ移行する前はこの設定は削除しない方が良いと思われます。

0
Raw
https://www.techtips.page/ja/comments/658
❤️1

rails 7.2からrails 8.0への移行(アップデート、アップグレード)で必要な作業

wakairo @wakairo
最終更新

Rails 8.0におけるaction_controller.perform_cachingとaction_mailer.perform_caching

config.action_controller.perform_cachingconfig.action_mailer.perform_cachingは、両方ともキャッシュ機能を有効にするかどうかの設定です。

rails newで生成されるconfig/environments/test.rbにおいて、 8.0からは以下のようにこれらの設定を無効にするコードが削除されました(この変更のPRこの変更のCommit)。

-  # Show full error reports and disable caching.
+  # Show full error reports.
   config.consider_all_requests_local = true
-  config.action_controller.perform_caching = false
   config.cache_store = :null_store
-  # Disable caching for Action Mailer templates even if Action Controller
-  # caching is enabled.
-  config.action_mailer.perform_caching = false

公式として8.0からはテスト環境ではキャッシュが効いた状態を標準とするということだと思いますので、既存アプリでも同じ設定変更、つまり、設定の削除をしても良いかもしれません。

0
Raw
https://www.techtips.page/ja/comments/657