<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://rubyonrails.org/feed.xml" rel="self" type="application/atom+xml" /><link href="https://rubyonrails.org/" rel="alternate" type="text/html" /><updated>2026-04-17T08:18:43+00:00</updated><id>https://rubyonrails.org/feed.xml</id><title type="html">Ruby on Rails: Compress the complexity of modern web apps</title><subtitle>A full-stack web application framework written in Ruby, following the Model View Controller pattern, that includes everything you need to build modern database-backed web apps.</subtitle><entry><title type="html">Query command for database queries and more</title><link href="https://rubyonrails.org/2026/4/17/this-week-in-rails" rel="alternate" type="text/html" title="Query command for database queries and more" /><published>2026-04-17T00:00:00+00:00</published><updated>2026-04-17T00:00:00+00:00</updated><id>https://rubyonrails.org/2026/4/17/this-week-in-rails</id><content type="html" xml:base="https://rubyonrails.org/2026/4/17/this-week-in-rails"><![CDATA[<p>Hi, <a href="https://x.com/morgoth85">Wojtek</a> here. Let’s see what’s new in the Rails on this finally sunny day (at least in my corner of the world ;-)</p>

<p><a href="https://github.com/rails/rails/pull/57156">Query command for read-only database queries</a><br />
Adds <em>rails query</em> — a read-only database query command with structured JSON output.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>rails query <span class="s2">"Account.where(plan: 'premium').limit(2)"</span>
</code></pre></div></div>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"columns"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"id"</span><span class="p">,</span><span class="w"> </span><span class="s2">"name"</span><span class="p">,</span><span class="w"> </span><span class="s2">"plan"</span><span class="p">,</span><span class="w"> </span><span class="s2">"created_at"</span><span class="p">],</span><span class="w">
  </span><span class="nl">"rows"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="s2">"Acme"</span><span class="p">,</span><span class="w"> </span><span class="s2">"premium"</span><span class="p">,</span><span class="w"> </span><span class="s2">"2025-01-15T10:30:00Z"</span><span class="p">],</span><span class="w">
    </span><span class="p">[</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="s2">"Widgets Co"</span><span class="p">,</span><span class="w"> </span><span class="s2">"premium"</span><span class="p">,</span><span class="w"> </span><span class="s2">"2025-03-22T14:00:00Z"</span><span class="p">]</span><span class="w">
  </span><span class="p">],</span><span class="w">
  </span><span class="nl">"meta"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"row_count"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w">
    </span><span class="nl">"query_time_ms"</span><span class="p">:</span><span class="w"> </span><span class="mf">4.2</span><span class="p">,</span><span class="w">
    </span><span class="nl">"page"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w">
    </span><span class="nl">"per_page"</span><span class="p">:</span><span class="w"> </span><span class="mi">100</span><span class="p">,</span><span class="w">
    </span><span class="nl">"has_more"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w">
    </span><span class="nl">"sql"</span><span class="p">:</span><span class="w"> </span><span class="s2">"SELECT </span><span class="se">\"</span><span class="s2">accounts</span><span class="se">\"</span><span class="s2">.* FROM </span><span class="se">\"</span><span class="s2">accounts</span><span class="se">\"</span><span class="s2"> WHERE </span><span class="se">\"</span><span class="s2">accounts</span><span class="se">\"</span><span class="s2">.</span><span class="se">\"</span><span class="s2">plan</span><span class="se">\"</span><span class="s2"> = 'premium' LIMIT 2"</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>There are many more possibilities and additional subcommands available, such as <em>query schema</em>, <em>query models</em>, and <em>query explain</em>.</p>

<p><a href="https://github.com/rails/rails/pull/57188">Add charset=utf-8 to Content-Type for static CSS and HTML files</a><br />
<em>ActionDispatch::FileHandler#try_files</em> now appends <em>; charset=utf-8</em> to the Content-Type header for <em>CSS</em> and <em>HTML</em> static files.
This is consistent with the rest of the Rails stack, which already assumes UTF-8 in all possible places.</p>

<p><a href="https://github.com/rails/rails/pull/57184">Add offline fallback page to the PWA scaffold</a><br />
New Rails apps now include an <em>app/views/pwa/offline.html.erb</em> template and a commented <em>get “offline”</em> route, alongside the existing manifest and service worker. The service worker template also includes a commented example for caching and serving the offline page.</p>

<p><a href="https://github.com/rails/rails/pull/57152">Rewrite the Layouts and Rendering guide</a><br />
New documentation pull request awaiting community review.</p>

<p><a href="https://github.com/rails/rails/pull/57190">Fix IO copy stream writing to Action Controller Live Buffer</a><br />
In addition to the fix, return the number of bytes written from <em>write</em> method.</p>

<p><a href="https://github.com/rails/rails/pull/57187">Fix reset_counters when using string IDs</a><br />
The fix brings consistency with other Active Record methods that already accepted string IDs.</p>

<p><a href="https://github.com/rails/rails/pull/57166">Use hash lookup for exact-match regexp filters in ParameterFilter</a><br />
When <em>ParameterFilter</em> is initialized with anchored regexp filters like <em>/^code$/</em> or <em>/\Atoken\z/</em>, extract the literal string and store it in a Hash for O(1) lookup instead of iterating all regexps with <em>.any?</em>.</p>

<p><a href="https://github.com/rails/rails/pull/55865">Make the warning about Active Storage redirect and proxy mode stronger</a><br />
The existing documentation implied that the “hard to guess” URLs Active Storage generates provides some sort of access control. This is not the case. Rather, as they rely on <em>ActiveRecord::SignedId</em>, they’re tamper proof and don’t expose the underlying id.
The security risk of using these URLs isn’t that someone will guess them. Rather, it is if the URLs are ever leaked, the files will be exposed.</p>

<p><em>You can view the whole list of changes <a href="https://github.com/rails/rails/compare/@%7B2026-04-10%7D...main@%7B2026-04-17%7D">here</a>.</em><br />
<em>We had <a href="https://contributors.rubyonrails.org/contributors/in-time-window/20260410-20260417">12 contributors</a> to the Rails codebase this past week!</em></p>

<p>Until next time!</p>

<p><em><a href="https://world.hey.com/this.week.in.rails">Subscribe</a> to get these updates mailed to you.</em></p>]]></content><author><name>Wojtek</name></author><category term="news" /><summary type="html"><![CDATA[Hi, Wojtek here. Let’s see what’s new in the Rails on this finally sunny day (at least in my corner of the world ;-)]]></summary></entry><entry><title type="html">Explicit query: and body: kwargs for integration tests and more!</title><link href="https://rubyonrails.org/2026/4/10/this-week-in-rails" rel="alternate" type="text/html" title="Explicit query: and body: kwargs for integration tests and more!" /><published>2026-04-10T00:00:00+00:00</published><updated>2026-04-10T00:00:00+00:00</updated><id>https://rubyonrails.org/2026/4/10/this-week-in-rails</id><content type="html" xml:base="https://rubyonrails.org/2026/4/10/this-week-in-rails"><![CDATA[<p>Hi, I’m <a href="https://hayford.dev/">Emmanuel Hayford</a>. Here’s what caught my eye in Rails this week.</p>

<p><a href="https://github.com/rails/rails/pull/57140">Fix GET+JSON+params in integration tests for API-only apps</a><br />
<code class="language-plaintext highlighter-rouge">params:</code> in integration test helpers was ambiguous for GET requests with <code class="language-plaintext highlighter-rouge">as: :json</code> — it wasn’t clear whether params should go in the query string or request body. The original workaround converted GET to POST with <code class="language-plaintext highlighter-rouge">X-Http-Method-Override</code>, which broke API-only apps that exclude <code class="language-plaintext highlighter-rouge">Rack::MethodOverride</code>. New <code class="language-plaintext highlighter-rouge">query:</code> and <code class="language-plaintext highlighter-rouge">body:</code> kwargs give explicit control: <code class="language-plaintext highlighter-rouge">query:</code> always lands in the URL query string, <code class="language-plaintext highlighter-rouge">body:</code> always goes into the encoded request body, and <code class="language-plaintext highlighter-rouge">params:</code> keeps its existing behavior unchanged.</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">get</span>  <span class="s2">"/search"</span><span class="p">,</span> <span class="ss">query: </span><span class="p">{</span> <span class="ss">q: </span><span class="s2">"rails"</span> <span class="p">},</span> <span class="ss">as: :json</span>
<span class="n">post</span> <span class="s2">"/search"</span><span class="p">,</span> <span class="ss">query: </span><span class="p">{</span> <span class="ss">page: </span><span class="mi">1</span> <span class="p">},</span> <span class="ss">body: </span><span class="p">{</span> <span class="ss">filters: </span><span class="p">{}</span> <span class="p">},</span> <span class="ss">as: :json</span>
</code></pre></div></div>

<p><a href="https://github.com/rails/rails/pull/57124">Add request.safe_method? and request.unsafe_method?</a><br />
Two new predicate methods on <code class="language-plaintext highlighter-rouge">ActionDispatch::Request</code> let you ask whether the current HTTP method is safe (GET, HEAD, OPTIONS, TRACE) or unsafe (everything else), per <a href="https://httpwg.org/specs/rfc9110.html#safe.methods">RFC 9110</a>.</p>

<p><a href="https://github.com/rails/rails/pull/56775">Update Action Cable origin check to respect X-Forwarded-Host</a><br />
The <code class="language-plaintext highlighter-rouge">allow_same_origin_as_host</code> check in <code class="language-plaintext highlighter-rouge">allow_request_origin?</code> compared the browser’s Origin header against the raw <code class="language-plaintext highlighter-rouge">HTTP_HOST</code>, which fails behind a reverse proxy where the internal host differs from the public one. This updates the check to use <code class="language-plaintext highlighter-rouge">request.host_with_port</code> and <code class="language-plaintext highlighter-rouge">request.ssl?</code> instead, consistent with how the rest of Rails resolves the host.</p>

<p><a href="https://github.com/rails/rails/pull/57152">Rewrite the Layouts and Rendering guide</a><br />
This pull request is open for review: it rewrites the layouts and rendering guide around how controllers and views work together, and trims or relocates overlap with other guides (partial rendering stays in the Action View Overview; request variants move here from the Action Controller Overview, which gets a short rendering intro that points here). If you use these guides or care how we explain Rails to newcomers, open the PR and share any feedback you have.</p>

<p><em>You can view the whole list of changes <a href="https://github.com/rails/rails/compare/@%7B2026-04-03%7D...main@%7B2026-04-10%7D">here</a>.</em><br />
<em>We had <a href="https://contributors.rubyonrails.org/contributors/in-time-window/20260403-20260410">9 contributors</a> to the Rails codebase this past week!</em></p>

<p>Until next time!</p>

<p><em><a href="https://world.hey.com/this.week.in.rails">Subscribe</a> to get these updates mailed to you.</em></p>]]></content><author><name>Emmanuel Hayford</name></author><category term="news" /><summary type="html"><![CDATA[Hi, I’m Emmanuel Hayford. Here’s what caught my eye in Rails this week.]]></summary></entry><entry><title type="html">Speedup ActiveRecord::LogSubscriber#sql_color and more!</title><link href="https://rubyonrails.org/2026/4/5/this-week-in-rails" rel="alternate" type="text/html" title="Speedup ActiveRecord::LogSubscriber#sql_color and more!" /><published>2026-04-05T00:00:00+00:00</published><updated>2026-04-05T00:00:00+00:00</updated><id>https://rubyonrails.org/2026/4/5/this-week-in-rails</id><content type="html" xml:base="https://rubyonrails.org/2026/4/5/this-week-in-rails"><![CDATA[<p>Hi, it’s <a href="https://www.saeloun.com/team/vipul/">Vipul</a>. Let’s explore this week’s
changes in the Rails codebase.</p>

<hr />

<p><a href="https://github.com/rails/rails/pull/57126">Remove fast_string_to_time workaround in ActiveModel::Type::Helpers::TimeValue</a><br />
Ruby 3.2.0 had a bug where <code class="language-plaintext highlighter-rouge">Time.new(..., in: "UTC")</code> could return an invalid Time object.
With the minimum supported Ruby now at 3.3.1, the runtime probe and workaround are dead code and have been removed.</p>

<p><a href="https://github.com/rails/rails/pull/57115">Add <code class="language-plaintext highlighter-rouge">prepend: true</code> option to <code class="language-plaintext highlighter-rouge">ActiveSupport::Notifications.subscribe</code></a><br />
A new prepend: true option on ActiveSupport::Notifications.subscribe ensures a subscriber runs before all others
enabling payload mutation before any downstream handler sees it.</p>

<p><a href="https://github.com/rails/rails/pull/57108">ActiveSupport::Cache add a fast path for string keys</a><br />
Since most cache keys are already strings, this PR short-circuits the #expanded_key normalization,
making every cache operation slightly faster.</p>

<p><a href="https://github.com/rails/rails/pull/57105">Speedup ActiveRecord::LogSubscriber#sql_color</a><br />
SQL queries can be very long, and unanchored regexps even with linear performance may take longer than Regexp.timeout.
This PR fixes this by anchoring the regexp patterns used to determine SQL color in the log subscriber.</p>

<p><a href="https://github.com/rails/rails/pull/57103">Update ActiveRecord::Associations::Preloader::Association.owners_by_key to handle composite keys</a><br />
<code class="language-plaintext highlighter-rouge">owners_by_key</code> was skipping nil key checks for composite keys since they are Arrays. A targeted <code class="language-plaintext highlighter-rouge">is_a?(Array)</code>
check is added to handle this correctly.</p>

<p><a href="https://github.com/rails/rails/pull/57094">Delay engine route building</a><br />
Engines calling <code class="language-plaintext highlighter-rouge">routes</code> directly were eagerly allocating route objects before lazy loading could kick in.
Route blocks are now deferred until after <code class="language-plaintext highlighter-rouge">route_set_class</code> is configured, so lazy loading works as intended.</p>

<p><a href="https://github.com/rails/rails/pull/57080">Deprecate schema_order option in PostgreSQL database configurations</a><br />
<code class="language-plaintext highlighter-rouge">schema_order</code> is an old alias for <code class="language-plaintext highlighter-rouge">schema_search_path</code> that predates the current naming. Use <code class="language-plaintext highlighter-rouge">schema_search_path</code> instead.</p>

<p><a href="https://github.com/rails/rails/pull/57077">Deprecate the strict option in MySQL database configurations</a><br />
The strict option for MySQL introduced in Rails 4.2 is now deprecated. The same behavior can be achieved directly via variables: { sql_mode: “…” }</p>

<p><a href="https://github.com/rails/rails/pull/57071">Fix titleize to capitalize unicode lowercase letters</a><br />
<code class="language-plaintext highlighter-rouge">Inflector#titleize</code> used <code class="language-plaintext highlighter-rouge">[a-z]</code> in its regex, silently skipping Unicode lowercase letters like đ, é, ü, ñ, ć.
Replacing it with <code class="language-plaintext highlighter-rouge">\p{Lower}</code> fixes capitalization for the full Unicode lowercase category.</p>

<p><a href="https://github.com/rails/rails/pull/57070">Allow skipping individual SET queries in PostgreSQL and MySQL configure_connection</a><br />
PostgreSQL and MySQL <code class="language-plaintext highlighter-rouge">configure_connection</code> now allow individual <code class="language-plaintext highlighter-rouge">SET</code> queries to be skipped by setting them to false in <code class="language-plaintext highlighter-rouge">database.yml</code>,
useful when connecting through a load balancer or proxy that manages session settings itself.</p>

<p><a href="https://github.com/rails/rails/pull/57053">Fix parallel test shutdown hang when workers die during Server#shutdown</a><br />
Fixed a shutdown hang where wait_for_active_workers would wait forever for workers that had already died unexpectedly.
A new reap_dead_workers method is now called inside the loop to detect and clean up any exited workers before waiting on them.</p>

<p><a href="https://github.com/rails/rails/pull/57050">Combine per-validator and top-level :if/:unless/:on in validates</a><br />
<code class="language-plaintext highlighter-rouge">:if</code>, <code class="language-plaintext highlighter-rouge">:unless</code>, and <code class="language-plaintext highlighter-rouge">:on</code> are now merged into arrays when specified at both the validator and top level, rather than the top-level silently overriding the per-validator option.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>validates :title, presence: { if: :local? }, if: :global?
# Now equivalent to:
validates_presence_of :title, if: [:global?, :local?]
</code></pre></div></div>

<p><a href="https://github.com/rails/rails/pull/57013">Predefine the well-known Postgres type OIDs</a><br />
Rails previously queried pg_type on every new connection to resolve type OIDs. Since built-in Postgres types have statically allocated OIDs, Rails now ships its own mapping and loads it for free on connect, deferring the query until an unknown type is actually encountered.</p>

<p><a href="https://github.com/rails/rails/pull/56664">Fix inverse_of on composite keys in ActiveRecord::Associations::Association#inversable?</a><br />
Composite keys were failing the <code class="language-plaintext highlighter-rouge">read_attribute</code> and <code class="language-plaintext highlighter-rouge">_has_attribute?</code> checks in <code class="language-plaintext highlighter-rouge">inversable?</code> because an array was being passed where a string was expected. Each key component is now read one-by-one.</p>

<p><a href="https://github.com/rails/rails/pull/55991">Add AGENTS.md with Rails codebase guide for AI coding agents</a><br />
A comprehensive AGENTS.md guide has been added to help AI coding agents contribute effectively to the Rails codebase.</p>

<p><em>You can view the whole list of changes <a href="https://github.com/rails/rails/compare/@%7B2026-03-27%7D...main@%7B2026-04-03%7D">here</a>.</em><br />
<em>We had <a href="https://contributors.rubyonrails.org/contributors/in-time-window/20260327-20260403">16 contributors</a> to the Rails codebase this past week!</em></p>

<p>Until next time!</p>

<p><em><a href="https://world.hey.com/this.week.in.rails">Subscribe</a> to get these updates mailed to you.</em></p>]]></content><author><name>vipulnsward</name></author><category term="news" /><summary type="html"><![CDATA[Hi, it’s Vipul. Let’s explore this week’s changes in the Rails codebase.]]></summary></entry><entry><title type="html">This Week in Rails: March 27, 2026</title><link href="https://rubyonrails.org/2026/3/27/this-week-in-rails" rel="alternate" type="text/html" title="This Week in Rails: March 27, 2026" /><published>2026-03-27T00:00:00+00:00</published><updated>2026-03-27T00:00:00+00:00</updated><id>https://rubyonrails.org/2026/3/27/this-week-in-rails</id><content type="html" xml:base="https://rubyonrails.org/2026/3/27/this-week-in-rails"><![CDATA[<p>Hi, it’s <a href="https://github.com/zzak">zzak</a>. Let’s explore this week’s changes in the Rails codebase.</p>

<p><a href="https://rubyonrails.org/2026/3/23/Rails-Versions-7-2-3-1-8-0-4-1-and-8-1-2-1-have-been-released">New Rails releases this week</a><br />
Rails 7.2.3.1, 8.0.4.1, and 8.1.2.1 shipped as security releases, followed by <a href="https://rubyonrails.org/2026/3/24/Rails-Versions-8-0-5-and-8-1-3-have-been-released">8.0.5 and 8.1.3</a> bugfix releases the next day.</p>

<p><a href="https://github.com/rails/rails/pull/57050">Combine per-validator and top-level :if/:unless/:on in validates</a><br />
<code class="language-plaintext highlighter-rouge">validates</code> now combines top-level and per-validator <code class="language-plaintext highlighter-rouge">:if</code>, <code class="language-plaintext highlighter-rouge">:unless</code>, and <code class="language-plaintext highlighter-rouge">:on</code> options instead of letting the inner options silently win.</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">validates</span> <span class="ss">:title</span><span class="p">,</span> <span class="ss">presence: </span><span class="p">{</span> <span class="ss">if: :local?</span> <span class="p">},</span> <span class="ss">if: :global?</span>
<span class="c1"># both conditions are now applied</span>
</code></pre></div></div>

<p><a href="https://github.com/rails/rails/pull/57071">Fix titleize to capitalize unicode lowercase letters</a><br />
<code class="language-plaintext highlighter-rouge">titleize</code> now capitalizes Unicode lowercase letters as well as ASCII, so <code class="language-plaintext highlighter-rouge">titleize("über ñoño")</code> becomes <code class="language-plaintext highlighter-rouge">Über Ñoño</code>.</p>

<p><a href="https://github.com/rails/rails/pull/57067">Classify mysql error 1046 (ER_NO_DB_ERROR) as ConnectionFailed</a><br />
MySQL’s <code class="language-plaintext highlighter-rouge">ER_NO_DB_ERROR</code> (<code class="language-plaintext highlighter-rouge">No database selected</code>) is now treated as <code class="language-plaintext highlighter-rouge">ActiveRecord::ConnectionFailed</code>, so Rails can retry it like other reconnect-related failures.</p>

<p><em>You can view the whole list of changes <a href="https://github.com/rails/rails/compare/@%7B2026-03-20%7D...main@%7B2026-03-27%7D">here</a>.</em><br />
<em>We had <a href="https://contributors.rubyonrails.org/contributors/in-time-window/20260320-20260327">18 contributors</a> to the Rails codebase this past week!</em></p>

<p>Until next time!</p>

<p><em><a href="https://world.hey.com/this.week.in.rails">Subscribe</a> to get these updates mailed to you.</em></p>]]></content><author><name>zzak</name></author><category term="news" /><summary type="html"><![CDATA[Hi, it’s zzak. Let’s explore this week’s changes in the Rails codebase.]]></summary></entry><entry><title type="html">Rails Versions 8.0.5 and 8.1.3 have been released!</title><link href="https://rubyonrails.org/2026/3/24/Rails-Versions-8-0-5-and-8-1-3-have-been-released" rel="alternate" type="text/html" title="Rails Versions 8.0.5 and 8.1.3 have been released!" /><published>2026-03-24T20:00:00+00:00</published><updated>2026-03-24T20:00:00+00:00</updated><id>https://rubyonrails.org/2026/3/24/Rails-Versions-8-0-5-and-8-1-3-have-been-released</id><content type="html" xml:base="https://rubyonrails.org/2026/3/24/Rails-Versions-8-0-5-and-8-1-3-have-been-released"><![CDATA[<p>Hello again everyone! <a href="/2026/3/23/Rails-Versions-7-2-3-1-8-0-4-1-and-8-1-2-1-have-been-released">Long time no see 😆</a>.</p>

<p>Rails Versions 8.0.5 and 8.1.3 have been released! These are regular bugfix releases.</p>

<p>These also include the changes from <a href="/2026/3/23/Rails-Versions-7-2-3-1-8-0-4-1-and-8-1-2-1-have-been-released">yesterday’s security releases</a>, so if you haven’t upgraded yet you’ll get those fixes too.</p>

<p>The Rails 8.1 series will continue receiving bug fixes until October 2026.  The
8.0 series will change to only receiving security updates in May next month, so
this might be the last bug fix release in that series. See our <a href="https://rubyonrails.org/maintenance">Maintenance
policy</a> for more information.</p>

<h2 id="changes-since-812">CHANGES since 8.1.2</h2>

<p>To see a summary of changes, please read the release on GitHub:</p>

<p><a href="https://github.com/rails/rails/releases/tag/v8.1.3">8.1.3 CHANGELOG</a>
To view the changes for each gem, please read the changelogs on GitHub:</p>
<ul>
  <li><a href="https://github.com/rails/rails/blob/v8.1.3/actioncable/CHANGELOG.md">Action Cable CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.1.3/actionmailbox/CHANGELOG.md">Action Mailbox CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.1.3/actionmailer/CHANGELOG.md">Action Mailer CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.1.3/actionpack/CHANGELOG.md">Action Pack CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.1.3/actiontext/CHANGELOG.md">Action Text CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.1.3/actionview/CHANGELOG.md">Action View CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.1.3/activejob/CHANGELOG.md">Active Job CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.1.3/activemodel/CHANGELOG.md">Active Model CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.1.3/activerecord/CHANGELOG.md">Active Record CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.1.3/activestorage/CHANGELOG.md">Active Storage CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.1.3/activesupport/CHANGELOG.md">Active Support CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.1.3/railties/CHANGELOG.md">Railties CHANGELOG</a></li>
</ul>

<p><em>Full listing</em></p>

<p>To see the full list of changes, <a href="https://github.com/rails/rails/compare/v8.1.2...v8.1.3">check out all the commits on
GitHub</a>.</p>

<h2 id="changes-since-804">CHANGES since 8.0.4</h2>

<p>To see a summary of changes, please read the release on GitHub:</p>

<p><a href="https://github.com/rails/rails/releases/tag/v8.0.5">8.0.5 CHANGELOG</a>
To view the changes for each gem, please read the changelogs on GitHub:</p>
<ul>
  <li><a href="https://github.com/rails/rails/blob/v8.0.5/actioncable/CHANGELOG.md">Action Cable CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.0.5/actionmailbox/CHANGELOG.md">Action Mailbox CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.0.5/actionmailer/CHANGELOG.md">Action Mailer CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.0.5/actionpack/CHANGELOG.md">Action Pack CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.0.5/actiontext/CHANGELOG.md">Action Text CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.0.5/actionview/CHANGELOG.md">Action View CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.0.5/activejob/CHANGELOG.md">Active Job CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.0.5/activemodel/CHANGELOG.md">Active Model CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.0.5/activerecord/CHANGELOG.md">Active Record CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.0.5/activestorage/CHANGELOG.md">Active Storage CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.0.5/activesupport/CHANGELOG.md">Active Support CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.0.5/railties/CHANGELOG.md">Railties CHANGELOG</a></li>
</ul>

<p><em>Full listing</em></p>

<p>To see the full list of changes, <a href="https://github.com/rails/rails/compare/v8.0.4...v8.0.5">check out all the commits on
GitHub</a>.</p>

<h2 id="sha-256">SHA-256</h2>

<p>If you’d like to verify that your gem is the same as the one I’ve uploaded,
please use these SHA-256 hashes.</p>

<p>Here are the checksums for 8.0.5:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>37f213ff6a37cf3fadfa1a28c1a9678e2cb73b59bb9ebd0eeeca653cccadcb23  pkg/activesupport-8.0.5.gem
c796813d46dc1373f4c6c0ec91dfc520b53683ea773c3b3f9a12c4b3eb145bc2  pkg/activemodel-8.0.5.gem
89b261b6cd910c9431cf2475f3f6e5e2f5ce589805043a33ef2b004376a129e6  pkg/activerecord-8.0.5.gem
6d0fa9e63df0cf2729b1f54d0988336c149eb2bbc6049f4c2834d7b62f351413  pkg/actionview-8.0.5.gem
c9de868975dd124a0956499140bd5e63c367865deca01292df7c3195c8da4b35  pkg/actionpack-8.0.5.gem
2dabe5c3bfe284aba4687c52b930564335435dde3a60b047821f9d3bd0d2ea10  pkg/activejob-8.0.5.gem
7918fac842cfe985ed21692f3d212c914a0c816e30e6fa68633177bb22f38561  pkg/actionmailer-8.0.5.gem
01a1d1a48b63b1a643fae6b7b4eb2859af55f507b335fca9ab869a5c6742bb8b  pkg/actioncable-8.0.5.gem
25898a3f8f8aced15ea6a8578cb56955acf3a96ad931e000b2e77e9c8db43df3  pkg/activestorage-8.0.5.gem
2651a87c0cc3dd1243a3afe64c052e71138f99006b3a5d3fa519198735500054  pkg/actionmailbox-8.0.5.gem
12f3ce3d6326230728316ba14eeac27b2100d6e7d9bfcb4b01fb27b187a812e1  pkg/actiontext-8.0.5.gem
ad98c6e9a096b7e8cf63c70872b60ec6c1d4152be2a4ffa63483ec02a837a9d5  pkg/railties-8.0.5.gem
4cb40f90948be292fa15cc7cb37757b97266585145c6e76957464b40edfd5be6  pkg/rails-8.0.5.gem
</code></pre></div></div>

<p>Here are the checksums for 8.1.3:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>21a5e0dfbd4c3ddd9e1317ec6a4d782fa226e7867dc70b0743acda81a1dca20e  pkg/activesupport-8.1.3.gem
90c05cbe4cef3649b8f79f13016191ea94c4525ce4a5c0fb7ef909c4b91c8219  pkg/activemodel-8.1.3.gem
8003be7b2466ba0a2a670e603eeb0a61dd66058fccecfc49901e775260ac70ab  pkg/activerecord-8.1.3.gem
1347c88c7f3edb38100c5ce0e9fb5e62d7755f3edc1b61cce2eb0b2c6ea2fd5d  pkg/actionview-8.1.3.gem
af998cae4d47c5d581a2cc363b5c77eb718b7c4b45748d81b1887b25621c29a3  pkg/actionpack-8.1.3.gem
a149b1766aa8204c3c3da7309e4becd40fcd5529c348cffbf6c9b16b565fe8d3  pkg/activejob-8.1.3.gem
831f724891bb70d0aaa4d76581a6321124b6a752cb655c9346aae5479318448d  pkg/actionmailer-8.1.3.gem
e5bc7f75e44e6a22de29c4f43176927c3a9ce4824464b74ed18d8226e75a80f0  pkg/actioncable-8.1.3.gem
0564ce9309143951a67615e1bb4e090ee54b8befed417133cae614479b46384d  pkg/activestorage-8.1.3.gem
df7da474eaa0e70df4ed5a6fef66eb3b3b0f2dbf7f14518deee8d77f1b4aae59  pkg/actionmailbox-8.1.3.gem
d291019c00e1ea9e6463011fa214f6081a56d7b9a1d224e7d3f6384c1dafc7d2  pkg/actiontext-8.1.3.gem
913eb0e0cb520aac687ffd74916bd726d48fa21f47833c6292576ef6a286de22  pkg/railties-8.1.3.gem
6d017ba5348c98fc909753a8169b21d44de14d2a0b92d140d1a966834c3c9cd3  pkg/rails-8.1.3.gem
</code></pre></div></div>

<p>As always, huge thanks to the many contributors who helped with this release.</p>

<p>Happy upgrading and have a good day!</p>]]></content><author><name>jhawthorn</name></author><category term="releases" /><summary type="html"><![CDATA[Hello again everyone! Long time no see 😆.]]></summary></entry><entry><title type="html">Rails Versions 7.2.3.1, 8.0.4.1, and 8.1.2.1 have been released!</title><link href="https://rubyonrails.org/2026/3/23/Rails-Versions-7-2-3-1-8-0-4-1-and-8-1-2-1-have-been-released" rel="alternate" type="text/html" title="Rails Versions 7.2.3.1, 8.0.4.1, and 8.1.2.1 have been released!" /><published>2026-03-23T22:00:00+00:00</published><updated>2026-03-23T22:00:00+00:00</updated><id>https://rubyonrails.org/2026/3/23/Rails-Versions-7-2-3-1-8-0-4-1-and-8-1-2-1-have-been-released</id><content type="html" xml:base="https://rubyonrails.org/2026/3/23/Rails-Versions-7-2-3-1-8-0-4-1-and-8-1-2-1-have-been-released"><![CDATA[<p>Hi friends!</p>

<p>Rails Versions 7.2.3.1, 8.0.4.1, and 8.1.2.1 have been released!</p>

<p>These are security patches addressing 10 security issues:</p>

<ul>
  <li>An issue where in development mode, an exception could be printed without escaping. This could affect a developer running a server locally and clicking a malicious URL.</li>
  <li>Multiple potential XSS vulnerabilities in Action Pack, Action View, and Active Support</li>
  <li>Two potential DoS vulnerabilities in Active Storage related to range requests</li>
  <li>Two potential DoS vulnerabilities in Active Support related to number formatting</li>
  <li>A potential path traversal and glob injection vulnerability in Active Storage DiskService</li>
  <li>Insufficient filtering of metadata in Active Storage direct uploads</li>
</ul>

<p>We strongly recommend upgrading as soon as possible.</p>

<p>Older versions of Rails are unsupported, and users are recommended to upgrade to at least the 7.2 series. See our <a href="https://rubyonrails.org/maintenance">maintenance policy</a> for details.</p>

<p>Here is a list of security issues that these releases address:</p>

<ul>
  <li><a href="https://discuss.rubyonrails.org/t/cve-2026-33167-possible-xss-vulnerability-in-action-pack-debug-exceptions/90913">CVE-2026-33167 Possible XSS vulnerability in Action Pack debug exceptions</a></li>
  <li><a href="https://discuss.rubyonrails.org/t/cve-2026-33168-possible-xss-vulnerability-in-action-view-tag-helpers/90912">CVE-2026-33168 Possible XSS vulnerability in Action View tag helpers</a></li>
  <li><a href="https://discuss.rubyonrails.org/t/cve-2026-33169-possible-redos-vulnerability-in-number-to-delimited-in-active-support/90911">CVE-2026-33169 Possible ReDoS vulnerability in number_to_delimited in Active Support</a></li>
  <li><a href="https://discuss.rubyonrails.org/t/cve-2026-33170-possible-xss-vulnerability-in-safebuffer-in-active-support/90910">CVE-2026-33170 Possible XSS vulnerability in SafeBuffer#% in Active Support</a></li>
  <li><a href="https://discuss.rubyonrails.org/t/cve-2026-33173-insufficient-filtering-of-metadata-in-active-storage-direct-uploads/90909">CVE-2026-33173 Insufficient filtering of metadata in Active Storage direct uploads</a></li>
  <li><a href="https://discuss.rubyonrails.org/t/cve-2026-33174-possible-dos-vulnerability-in-active-storage-proxy-mode-via-range-requests/90908">CVE-2026-33174 Possible DoS vulnerability in Active Storage proxy mode via Range requests</a></li>
  <li><a href="https://discuss.rubyonrails.org/t/cve-2026-33176-possible-dos-vulnerability-in-active-support-number-helpers/90907">CVE-2026-33176 Possible DoS vulnerability in Active Support number helpers</a></li>
  <li><a href="https://discuss.rubyonrails.org/t/cve-2026-33195-possible-path-traversal-in-active-storage-diskservice/90904">CVE-2026-33195 Possible path traversal in Active Storage DiskService</a></li>
  <li><a href="https://discuss.rubyonrails.org/t/cve-2026-33202-possible-glob-injection-in-active-storage-diskservice/90903">CVE-2026-33202 Possible glob injection in Active Storage DiskService</a></li>
  <li><a href="https://discuss.rubyonrails.org/t/cve-2026-33658-possible-dos-vulnerability-in-active-storage-proxy-mode-via-multi-range-requests/90906">CVE-2026-33658 Possible DoS vulnerability in Active Storage proxy mode via multi-range requests</a></li>
</ul>

<p>Cheers! We plan to follow up with a bugfix release for the 8.0 and 8.1 series soon!</p>

<h2 id="sha-256">SHA-256</h2>

<p>If you’d like to verify that your gems are the same as the ones we’ve uploaded,
please use these SHA-256 hashes.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>11ebed516a43a0bb47346227a35ebae4d9427465a7c9eb197a03d5c8d283cb34  pkg/activesupport-7.2.3.1.gem
39e1869b85e7a0b64a8ccddf19f3fb0c44261b329785384bb88f878eab51c0d0  pkg/activemodel-7.2.3.1.gem
b89513e275da5b34183c5f2a497c154b02dcc7c811d399ab557e67e36170a05d  pkg/activerecord-7.2.3.1.gem
de19b86843391762ac24a6287c30fbba11cd475fa4d4b664924d5fb7a2f1ff7c  pkg/actionview-7.2.3.1.gem
b66afe7f937273270cb63f03bde7af7ba850017867766e8848d06d3e12e1e4ca  pkg/actionpack-7.2.3.1.gem
0bc4227ce371b82da119cd27ed91e0deb9b744bbfa266b86e4bd8d1e2a8f6ed8  pkg/activejob-7.2.3.1.gem
f578b6d5c5f81a20b6f6a796187698890c8348c041daa5e2e7cf7814ac520467  pkg/actionmailer-7.2.3.1.gem
d3bf40a3f4fc79a09709878f0e5c43a5e2d8e6607089f6b38f9472b8715eb33c  pkg/actioncable-7.2.3.1.gem
0b224ea42e6256d3e33768bdccad8e3c9110a5140fc9faf98bde8873dd5dffab  pkg/activestorage-7.2.3.1.gem
a4e73480c97ab2fff5a416f92c54b065b1a6564ea4a807d42e0b83a94d4ec541  pkg/actionmailbox-7.2.3.1.gem
5b1418f407ea347b98084a62b9b6caa1d3b1eb482d18dbbb69fad43f242843e3  pkg/actiontext-7.2.3.1.gem
aea3393ee10243ceedcbeccb45458a0d58b524b6d21bf32eff8b93853baae15a  pkg/railties-7.2.3.1.gem
96c0a0160081ef3f1e407438880f6194c6ec94cdf40c8f83fc7bb22c279eba94  pkg/rails-7.2.3.1.gem
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>822187e99ebca3e90bf03e6ccef5b57447592657f6b1676ccaaa25794ebfc7e6  pkg/activesupport-8.0.4.1.gem
1ee25e1241bfd48b2682fa14aadb399065dc4f045dc234422344c408b3394af5  pkg/activemodel-8.0.4.1.gem
182582af961c3877017477d1ff14bba7fabc634ba4e3f257da4d8aab963ae7bd  pkg/activerecord-8.0.4.1.gem
bdd726498c12174c4ba8fb489c630ea9bf2f4db1f09d59ec227f318d1ec78d80  pkg/actionview-8.0.4.1.gem
f1c8b3673340f8f478a083ae55c58ad6989455d7daad554ff64d70af36302c7d  pkg/actionpack-8.0.4.1.gem
1980d6241c9aeae112943de960bc8c41cf1c3741408c60709caed7a795976fb9  pkg/activejob-8.0.4.1.gem
90db7874504c7679dffeaa3ba0e8e824d0327898b59acbce221c735ea85e7d8f  pkg/actionmailer-8.0.4.1.gem
426f0cfa0e725cef4f6518ab24f7dd0290dded630fc39615f364fba9846f6c53  pkg/actioncable-8.0.4.1.gem
f2dcbe57643957922c9cbe676baef673a14003fcefd22174661599e74f20731e  pkg/activestorage-8.0.4.1.gem
604ec3836b79a383312cec2ca8d678695149b7d7de4c375d76b4535c034695c8  pkg/actionmailbox-8.0.4.1.gem
6abf7368f4dfe82290cfb9f18982174fb5632d9a5ebf5f2791332fbd4e4c250d  pkg/actiontext-8.0.4.1.gem
bdc4034d63f04f2bad26fbf9faa924701dba04f71fcdd746884ff0871a63818c  pkg/railties-8.0.4.1.gem
1de7e890f93925cabacb9be3a061a01bc86d686429152ccf7835206ab91b1795  pkg/rails-8.0.4.1.gem
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>beec20ced12ad569194554399449a6372fdab03061b8f48a9ed6ef9b7dc251b2  pkg/activesupport-8.1.2.1.gem
8f31a6f9c12fecb8e5a0fce8a8950cfd94f0d75829322935f99e8217a3e5f3c6  pkg/activemodel-8.1.2.1.gem
3f79140318ff6d23376f5d9b1b5b5e2c7d3cc8979dd71367e9a8394378ca630a  pkg/activerecord-8.1.2.1.gem
38daa7b87bca427e2967f139e5b7f0d1081271bdafd0e015d8ef97a006f570a6  pkg/actionview-8.1.2.1.gem
a6b69cd10ec4c8d978c8eee51206e34152b1c1be017e534236dbc89a3d00ffb8  pkg/actionpack-8.1.2.1.gem
c89c311d07fd358b76c581ed8fee87c5b4351fb44994f3389385c014d22182fe  pkg/activejob-8.1.2.1.gem
d7d62fbc2197f1a7006bb5af4c665edf999adf79ab6c10337c088d27e6622071  pkg/actionmailer-8.1.2.1.gem
a2f88cecce148b3fcb63d2e517d7694e119830a85baa7d6cf59e5453dcf32e8d  pkg/actioncable-8.1.2.1.gem
36794c9b8853ac9276b0386cb1f8973374d8e71e8a9666bb02e70f5b7c9c5391  pkg/activestorage-8.1.2.1.gem
c2e45c0c1e5687e35e050838c94a8aed0d954c56a32ea411d54cd848c338c54e  pkg/actionmailbox-8.1.2.1.gem
1e503ce600a6ab2e12a46f999959a7d8e2fdaff910ca01dcf3b968934b55d957  pkg/actiontext-8.1.2.1.gem
f4d902869541af4e5b5552d726062fa59ec0fd9078f7ab87720dbd93f22c43ee  pkg/railties-8.1.2.1.gem
93ebf1efc792c9bc47e9795259c920312d3920008dad3ae634b7a0457ffe0af8  pkg/rails-8.1.2.1.gem
</code></pre></div></div>]]></content><author><name>jhawthorn</name></author><category term="releases" /><summary type="html"><![CDATA[Hi friends!]]></summary></entry><entry><title type="html">This Week in Rails: March 20, 2026</title><link href="https://rubyonrails.org/2026/3/20/this-week-in-rails" rel="alternate" type="text/html" title="This Week in Rails: March 20, 2026" /><published>2026-03-20T00:00:00+00:00</published><updated>2026-03-20T00:00:00+00:00</updated><id>https://rubyonrails.org/2026/3/20/this-week-in-rails</id><content type="html" xml:base="https://rubyonrails.org/2026/3/20/this-week-in-rails"><![CDATA[<p>Hi, it’s <a href="https://github.com/gregmolnar">gregmolnar</a>. Let’s explore this week’s changes in the Rails codebase.</p>

<p><a href="https://github.com/rails/rails/pull/57000">Batch SQL statements when creating tables</a><br />
This change batches the SQL statements during loading a database schema to improve the performance of the process.</p>

<p><a href="https://github.com/rails/rails/pull/56992">Deprecate require_dependency</a><br />
<code class="language-plaintext highlighter-rouge">require_dependency</code> is deprecated without replacement and will be removed in Rails 9.</p>

<p><a href="https://github.com/rails/rails/pull/56972">Add MySQL lock option and extend algorithm to column Data Definition Language (DDL) operations</a><br />
This pull request adds:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">lock:</code> option for MySQL <code class="language-plaintext highlighter-rouge">add_index</code>, <code class="language-plaintext highlighter-rouge">remove_index</code>, and ALTER TABLE column operations (<code class="language-plaintext highlighter-rouge">add_column</code>, <code class="language-plaintext highlighter-rouge">remove_column</code>, <code class="language-plaintext highlighter-rouge">change_column</code>, <code class="language-plaintext highlighter-rouge">rename_column</code>)</li>
  <li><code class="language-plaintext highlighter-rouge">algorithm:</code> option support extended to ALTER TABLE column operations on MySQL</li>
  <li><code class="language-plaintext highlighter-rouge">CommandRecorder#invert_rename_column</code> now preserves <code class="language-plaintext highlighter-rouge">algorithm:</code> and <code class="language-plaintext highlighter-rouge">lock:</code> options on rollback</li>
</ul>

<p>MySQL supports <code class="language-plaintext highlighter-rouge">ALGORITHM = {DEFAULT|COPY|INPLACE|INSTANT}</code> and <code class="language-plaintext highlighter-rouge">LOCK = {DEFAULT|NONE|SHARED|EXCLUSIVE}</code> to control how DDL operations are performed, enabling online schema changes without blocking reads or writes.</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">add_index</span>    <span class="ss">:users</span><span class="p">,</span> <span class="ss">:email</span><span class="p">,</span> <span class="ss">algorithm: :inplace</span><span class="p">,</span> <span class="ss">lock: :none</span>
<span class="n">remove_index</span> <span class="ss">:users</span><span class="p">,</span> <span class="ss">:email</span><span class="p">,</span> <span class="ss">algorithm: :inplace</span><span class="p">,</span> <span class="ss">lock: :none</span>
<span class="n">add_column</span>    <span class="ss">:users</span><span class="p">,</span> <span class="ss">:name</span><span class="p">,</span> <span class="ss">:string</span><span class="p">,</span> <span class="ss">algorithm: :instant</span><span class="p">,</span> <span class="ss">lock: :none</span>
<span class="n">change_column</span> <span class="ss">:users</span><span class="p">,</span> <span class="ss">:name</span><span class="p">,</span> <span class="ss">:string</span><span class="p">,</span> <span class="ss">null: </span><span class="kp">false</span><span class="p">,</span> <span class="ss">algorithm: :inplace</span><span class="p">,</span> <span class="ss">lock: :none</span>
<span class="n">remove_column</span> <span class="ss">:users</span><span class="p">,</span> <span class="ss">:name</span><span class="p">,</span> <span class="ss">algorithm: :inplace</span><span class="p">,</span> <span class="ss">lock: :none</span>
<span class="n">rename_column</span> <span class="ss">:users</span><span class="p">,</span> <span class="ss">:name</span><span class="p">,</span> <span class="ss">:full_name</span><span class="p">,</span> <span class="ss">algorithm: :inplace</span><span class="p">,</span> <span class="ss">lock: :none</span>
</code></pre></div></div>

<p><a href="https://github.com/rails/rails/pull/56967">Optimize generated Dockerfile build performance</a><br />
The Dockerfile generated for new Rails applications received two performance optimizations. You can look at the diff and copy over the changes to your Dockerfile to have a faster Docker build.</p>

<p><a href="https://github.com/rails/rails/pull/56945">Active Record: Support Postgres <em>RESET</em> on readonly queries</a><br />
This Pull Request has been created because the PostgreSQL adapter currently raises an ActiveRecord::ReadOnlyError when attempting to execute a <a href="https://www.postgresql.org/docs/current/sql-reset.html">RESET</a> command within a read-only context (e.g., <code class="language-plaintext highlighter-rouge">prevent_writes: true</code>).</p>

<p><code class="language-plaintext highlighter-rouge">RESET</code> acts as a syntactic shortcut for <code class="language-plaintext highlighter-rouge">SET configuration_parameter TO DEFAULT</code>.</p>

<p><a href="https://github.com/rails/rails/pull/56926">Action Text: support block children in editor elements alongside value</a><br />
Blocks were introduced to Action Text earlier, but only as an alternative to the value argument: the block was captured and used as the initial editor content, making it either value OR block — not both.<br />
This pull request changes the block semantics so that blocks render as DOM children of the editor element instead. Value and block are now independent: value flows into the editor’s content binding, while the block renders as inner DOM children — useful for embedding custom elements such as prompt menus or toolbar extensions. This enables other editors like Lexxy to use the block form for configuration — injecting child elements into the editor tag — while the rich text value is preserved separately and passed via standard <code class="language-plaintext highlighter-rouge">value</code> attribute.<br />
Trix preserves the original block-as-initial-value contract by capturing the block in <code class="language-plaintext highlighter-rouge">TrixEditor::Tag#render_in</code> when no value is present, keeping its hidden input populated as before.</p>

<p><em>You can view the whole list of changes <a href="https://github.com/rails/rails/compare/@%7B2026-03-13%7D...main@%7B2026-03-20%7D">here</a>.</em><br />
<em>We had <a href="https://contributors.rubyonrails.org/contributors/in-time-window/20260313-20260320">15 contributors</a> to the Rails codebase this past week!</em></p>

<p>Until next time!</p>

<p><em><a href="https://world.hey.com/this.week.in.rails">Subscribe</a> to get these updates mailed to you.</em></p>]]></content><author><name>gregmolnar</name></author><category term="news" /><summary type="html"><![CDATA[Hi, it’s gregmolnar. Let’s explore this week’s changes in the Rails codebase.]]></summary></entry><entry><title type="html">Validate URI scheme in Action Text and more</title><link href="https://rubyonrails.org/2026/3/13/this-week-in-rails" rel="alternate" type="text/html" title="Validate URI scheme in Action Text and more" /><published>2026-03-13T00:00:00+00:00</published><updated>2026-03-13T00:00:00+00:00</updated><id>https://rubyonrails.org/2026/3/13/this-week-in-rails</id><content type="html" xml:base="https://rubyonrails.org/2026/3/13/this-week-in-rails"><![CDATA[<p>Hi, <a href="https://x.com/morgoth85">Wojtek</a> here. Let’s quickly look at a few of this week’s fixes.</p>

<p><a href="https://github.com/rails/rails/pull/56909">Validate URI scheme in Action Text markdown link conversion</a><br />
Add a <code class="language-plaintext highlighter-rouge">Rails::HTML::Sanitizer.allowed_uri?</code> check to <em>markdown_link</em>. When the URI scheme is disallowed, return the escaped title wrapped in escaped brackets (<code class="language-plaintext highlighter-rouge">\[title\]</code>) instead of emitting a link.</p>

<p>Example: <code class="language-plaintext highlighter-rouge">&lt;action-text-attachment url="data:text/html,PAYLOAD"&gt;</code> previously produced <code class="language-plaintext highlighter-rouge">![Image](data:text/html,PAYLOAD)</code> in markdown output. Now it produces <code class="language-plaintext highlighter-rouge">\[Image\]</code>.</p>

<p><a href="https://github.com/rails/rails/pull/56963">Restore previous instrumenter after execute_or_skip</a><br />
Fix by saving and restoring the previous instrumenter value around the <em>EventBuffer</em>’s lifetime. On background threads, this is a no-op (saves <em>nil</em>, restores <em>nil</em>). On the caller thread via <em>caller_runs</em>, it restores the real instrumenter and prevents contamination.</p>

<p><a href="https://github.com/rails/rails/pull/56967">Optimize generated Dockerfile build performance</a><br />
Reduces number of docker build layers.</p>

<p><a href="https://github.com/rails/rails/pull/56970">Fix parsing SQLite virtual tables without parenthesis</a><br />
Previously running <em>bin/rails db:migrate</em> with virtual tables crashed the schema dumper, which produced a broken <em>db/schema.rb</em> file.</p>

<p><em>You can view the whole list of changes <a href="https://github.com/rails/rails/compare/@%7B2026-03-06%7D...main@%7B2026-03-13%7D">here</a>.</em><br />
<em>We had <a href="https://contributors.rubyonrails.org/contributors/in-time-window/20260306-20260313">14 contributors</a> to the Rails codebase this past week!</em></p>

<p>Until next time!</p>

<p><em><a href="https://world.hey.com/this.week.in.rails">Subscribe</a> to get these updates mailed to you.</em></p>]]></content><author><name>Wojtek</name></author><category term="news" /><summary type="html"><![CDATA[Hi, Wojtek here. Let’s quickly look at a few of this week’s fixes.]]></summary></entry><entry><title type="html">This Week in Rails: March 6, 2026</title><link href="https://rubyonrails.org/2026/3/6/this-week-in-rails" rel="alternate" type="text/html" title="This Week in Rails: March 6, 2026" /><published>2026-03-06T00:00:00+00:00</published><updated>2026-03-06T00:00:00+00:00</updated><id>https://rubyonrails.org/2026/3/6/this-week-in-rails</id><content type="html" xml:base="https://rubyonrails.org/2026/3/6/this-week-in-rails"><![CDATA[<p>Hi, it’s <a href="https://github.com/claudiob">Claudio Baccigalupo</a>. Let’s explore this week’s changes in the Rails codebase.</p>

<p><a href="https://github.com/rails/rails/pull/56913">Set read-only permissions for GitHub Actions workflow generated by rails new</a><br />
The workflow will run with the minimum required permissions, regardless of the GitHub Organization settings.</p>

<p><a href="https://github.com/rails/rails/pull/56901">Don’t guard action_dispatch_request and action_cable load hooks</a><br />
Removes the load hooks guard for <code class="language-plaintext highlighter-rouge">action_dispatch_request</code> in Action Pack and <code class="language-plaintext highlighter-rouge">action_cable</code> in Action Cable.</p>

<p><a href="https://github.com/rails/rails/pull/56896">Improve Trix support for Action Text markdown</a><br />
Adds <code class="language-plaintext highlighter-rouge">&lt;del&gt;</code> as a strikethrough alias (Trix emits <code class="language-plaintext highlighter-rouge">&lt;del&gt;</code>, not <code class="language-plaintext highlighter-rouge">&lt;s&gt;</code>).
Also, add a <code class="language-plaintext highlighter-rouge">visit_div</code> handler so Trix-style <code class="language-plaintext highlighter-rouge">&lt;div&gt;</code> blocks pass through their children’s content, letting <code class="language-plaintext highlighter-rouge">&lt;br&gt;</code> tags handle paragraph spacing naturally.</p>

<p><a href="https://github.com/rails/rails/pull/56911">Specify PostgreSQL 9.5 or higher is required</a><br />
Rails includes <code class="language-plaintext highlighter-rouge">array_position</code> which is not available on previous versions.</p>

<p><a href="https://github.com/rails/rails/pull/56906">Fix Encoding::CompatibilityError with non-ASCII strict locals defaults</a><br />
Fixes an error raised by a template loaded via <code class="language-plaintext highlighter-rouge">File.binread</code> using strict locals with non-ASCII default values (e.g. <code class="language-plaintext highlighter-rouge">&lt;%# locals: (label: "café") -%&gt;</code>).</p>

<p><a href="https://github.com/rails/rails/pull/56902">Fix IsolatedExecutionState.share_with call</a><br />
When <code class="language-plaintext highlighter-rouge">isolation_level = :fiber</code>, it’s wrong to pass the original thread to <code class="language-plaintext highlighter-rouge">share_with</code>.</p>

<p><a href="https://github.com/rails/rails/pull/56891">Fix collection caching to preserve store default expires_in</a><br />
This change ensures that <code class="language-plaintext highlighter-rouge">expires_in</code> is only included in the arguments to <code class="language-plaintext highlighter-rouge">write_multi</code> when it is present in the collection cache options.</p>

<p><em>You can view the whole list of changes <a href="https://github.com/rails/rails/compare/@%7B2026-02-27%7D...main@%7B2026-03-06%7D">here</a>.</em><br />
<em>We had <a href="https://contributors.rubyonrails.org/contributors/in-time-window/20260227-20260306">12 contributors</a> to the Rails codebase this past week!</em></p>

<p>Until next time!</p>

<p><em><a href="https://world.hey.com/this.week.in.rails">Subscribe</a> to get these updates mailed to you.</em></p>]]></content><author><name>Claudio Baccigalupo</name></author><category term="news" /><summary type="html"><![CDATA[Hi, it’s Claudio Baccigalupo. Let’s explore this week’s changes in the Rails codebase.]]></summary></entry><entry><title type="html">Planning Center is the newest Rails Foundation Contributing member</title><link href="https://rubyonrails.org/2026/3/3/planning-center-newest-contributing-member" rel="alternate" type="text/html" title="Planning Center is the newest Rails Foundation Contributing member" /><published>2026-03-03T00:00:00+00:00</published><updated>2026-03-03T00:00:00+00:00</updated><id>https://rubyonrails.org/2026/3/3/planning-center-newest-contributing-member</id><content type="html" xml:base="https://rubyonrails.org/2026/3/3/planning-center-newest-contributing-member"><![CDATA[<p>We’re excited to welcome <a href="https://www.planningcenter.com/">Planning Center</a> as a Contributing member of the Rails Foundation - the first new member in 2026!</p>

<p style="text-align: center;"><img src="/assets/images/logo-planningcenter.svg" style="width: 55%;" /></p>

<p>Founded in 2005 and headquartered in Carlsbad, CA (with a fully remote team), Planning Center builds church management software used by more than 90,000 churches around the world. Their platform helps churches organize the practical details of ministry - service planning, volunteer scheduling, donations, event registrations, check-ins, small groups, and more.</p>

<p><strong>On Rails since day one</strong></p>

<p>If it runs at Planning Center, it runs on Rails, and has for nearly two decades. That includes:</p>

<ul>
  <li>Customer-facing web applications used daily by tens of thousands of churches</li>
  <li>API backends for their mobile apps and public developer API</li>
  <li>Church Center, their congregation-facing web experience</li>
  <li>Internal tools, account management, and billing systems</li>
</ul>

<p>The platform consists of multiple Rails applications, where each core product (Services, People, Groups, Giving, Registrations, Calendar, Check-Ins, Publishing, and more) runs as its own Rails app. In a world of majestic monoliths and sprawling microservices, Planning Center took another path: macroservices. (Internally, they call it the “Stonehenge architecture.” Nobody quite remembers why it was made that way, but it works, and people keep coming back to see it.)</p>

<p>Bootstrapped and profitable since day one, Planning Center has now grown to a team of 225 people, more than 100 of whom are engineers. The company has no outside investors, no debt, and <a href="https://www.planningcenter.com/blog/a-commitment-for-our-customers-never-being-acquired">no plans to sell</a>. In fact, they recently committed to transitioning to a non-profit structure, reinforcing their long-term commitment to serving churches rather than building equity.</p>

<p><strong>Joining the Rails Foundation</strong></p>

<p>Founder Jeff Berg has long been a member of the community, and was even in attendance at the first RailsConf back in 2006.</p>

<blockquote>
  <p>Rails is not just our framework, it’s the foundation our entire company grew up on. Every product, every API, every line of code that serves all churches runs on Rails. Joining the Rails Foundation felt less like a strategic decision and more like finally showing up to the family reunion.<br />
<br /><em>Jeff Berg CEO, CTO, &amp; Founder, Planning Center</em><br /></p>

</blockquote>

<p>Planning Center’s history of building, scaling, and sustaining a profitable, independent company on Rails is yet another testament to what the framework makes possible. We’re excited to have them on board, and we appreciate their support of our shared mission.</p>

<p>Welcome to the Foundation, Planning Center!</p>

<hr />

<p><strong>Planning Center</strong> joins <strong>Core members</strong> <a href="https://cookpad.com/">Cookpad</a>, <a href="https://www.doximity.com/">Doximity</a>, <a href="https://www.fleetio.com/">Fleetio</a>, <a href="https://github.com/">GitHub</a>, <a href="https://www.intercom.com/">Intercom</a>, <a href="https://judge.me/">Judge.me</a>, <a href="https://www.procore.com/">Procore</a>, <a href="https://www.shopify.com/">Shopify</a>, <a href="https://1password.com/">1Password</a> and <a href="https://37signals.com/">37signals</a>, and <strong>Contributing members</strong> <a href="https://www.appsignal.com/">AppSignal</a>, <a href="https://www.cedarcode.com/">Cedarcode</a>, <a href="https://www.chime.com/">Chime</a>, <a href="https://www.clio.com/">Clio</a>, <a href="https://fullscript.com/">Fullscript</a>, <a href="https://gusto.com/">Gusto</a>, <a href="https://www.higherpixels.com/">Higher Pixels</a>, <a href="https://makandra.de/">makandra</a>, <a href="https://www.planetargon.com/">Planet Argon</a>, <a href="https://www.renuo.ch/">Renuo</a>, <a href="https://www.saeloun.com/">Saeloun</a>, <a href="https://serpapi.com/">SerpApi</a>, and <a href="https://tablecheck.com/en/join">TableCheck</a>.</p>

<p>Learn more about the Rails Foundation and its mission <a href="/foundation">here</a>. If your company would like to join the list, please reach out to <a href="mailto:foundation@rubyonrails.org">foundation@rubyonrails.org</a>.</p>]]></content><author><name>Amanda Perino</name></author><category term="news," /><category term="foundation" /><summary type="html"><![CDATA[We’re excited to welcome Planning Center as a Contributing member of the Rails Foundation - the first new member in 2026!]]></summary></entry></feed>