<?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>2025-01-03T11:09:59+00:00</updated><id>https://rubyonrails.org/feed.xml</id><title type="html">Ruby on Rails</title><subtitle>A web-app framework that includes everything needed to create database-backed web applications according to the Model-View-Controller (MVC) pattern.</subtitle><entry><title type="html">Schema dumper versions formatter and more</title><link href="https://rubyonrails.org/2025/1/3/this-week-in-rails" rel="alternate" type="text/html" title="Schema dumper versions formatter and more" /><published>2025-01-03T00:00:00+00:00</published><updated>2025-01-03T00:00:00+00:00</updated><id>https://rubyonrails.org/2025/1/3/this-week-in-rails</id><content type="html" xml:base="https://rubyonrails.org/2025/1/3/this-week-in-rails"><![CDATA[<p>Hi, <a href="https://x.com/morgoth85">Wojtek</a> here. Let’s explore the first changes of the new year in the Rails codebase.</p>

<p><a href="https://github.com/rails/rails/pull/53797">Introduce versions formatter for the schema dumper</a><br />
It is now possible to override how schema dumper formats versions information inside the <em>structure.sql</em> file. Currently, the versions are simply sorted in the decreasing order. Within large teams, this can potentially cause many merge conflicts near the top of the list.</p>

<p>Now, the custom formatter can be provided with a custom sorting logic (e.g. by hash values of the versions), which can greatly reduce the number of conflicts.</p>

<p><a href="https://github.com/rails/rails/pull/54050">Replace SyntaxTree with Prism in rail_inspector</a><br />
Now that <em>Prism</em> has been stable for a while and is the default parser in Ruby 3.4, use it in the <em>rail_inspector</em>.</p>

<p><a href="https://github.com/rails/rails/pull/51496">Handle path_params gracefully when a user sends a string</a><br />
When url contains the query part <em>?path_params=string</em> it is now ignored and does not error.</p>

<p><a href="https://github.com/rails/rails/pull/54017">Fix setting to_time_preserves_timezone from “new framework defaults”</a><br />
Previously setting <code class="language-plaintext highlighter-rouge">Rails.application.config.active_support.to_time_preserves_timezone = :zone</code> in the initializer did not have effect.</p>

<p><em>You can view the whole list of changes <a href="https://github.com/rails/rails/compare/@%7B2024-12-27%7D...main@%7B2025-01-03%7D">here</a>.</em>
<em>We had <a href="https://contributors.rubyonrails.org/contributors/in-time-window/20241227-20250103">21 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 explore the first changes of the new year in the Rails codebase.]]></summary></entry><entry><title type="html">This year in Rails</title><link href="https://rubyonrails.org/2024/12/27/this-week-in-rails" rel="alternate" type="text/html" title="This year in Rails" /><published>2024-12-27T00:00:00+00:00</published><updated>2024-12-27T00:00:00+00:00</updated><id>https://rubyonrails.org/2024/12/27/this-week-in-rails</id><content type="html" xml:base="https://rubyonrails.org/2024/12/27/this-week-in-rails"><![CDATA[<p>This is Greg, Vipul, Wojciech, and Zzak, bringing you the summary of what happened with Rails in the past year. It was a busy year with close to <a href="https://github.com/rails/rails/compare/@%7B2024-01-01%7D...main@%7B2024-12-31%7D">4000 commits</a> from <a href="https://contributors.rubyonrails.org/contributors/in-time-window/20240101-20241231">555 contributors</a> and 50 releases, including Rails 8!</p>

<p>For this year end issue, as a team we each hand-picked some of our favorite pull requests from the year.</p>

<p><a href="https://rubyonrails.org/2024/12/18/wrap-up-2024-from-rails-foundation">2024 Wrap Up from the Rails Foundation</a><br />
Amanda wrote a summary of what the Rails Foundation has been up to this year and what she is plannning for next year.</p>

<p><a href="https://github.com/rails/rails/pull/50528">Add default PWA manifest and service worker file</a><br />
Progressive Web Apps got a lot of support in Rails this year starting with freshly generated Rails apps now include a manifest and service worker file to become full-fledged Progressive Web Applications.</p>

<p><a href="https://github.com/rails/rails/pull/50505">Add allow_browser to set minimum versions for your application</a><br />
Now you can easily specify which browsers you’ve supported to allow access to your application.</p>

<p><a href="https://github.com/rails/rails/pull/50490">Add rate limiting to Action Controller via the Kredis limiter type</a><br />
Rails got a built in rate limiter this year. Originally it was dependent on
Kredis, but it was <a href="https://github.com/rails/rails/pull/50781">quickly refactored</a> to use the Rails cache store.</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">SessionsController</span> <span class="o">&lt;</span> <span class="no">ApplicationController</span>
  <span class="n">rate_limit</span> <span class="ss">to: </span><span class="mi">10</span><span class="p">,</span> <span class="ss">within: </span><span class="mi">3</span><span class="p">.</span><span class="nf">minutes</span><span class="p">,</span> <span class="ss">only: :create</span>
<span class="k">end</span>

<span class="k">class</span> <span class="nc">SignupsController</span> <span class="o">&lt;</span> <span class="no">ApplicationController</span>
  <span class="n">rate_limit</span> <span class="ss">to: </span><span class="mi">1000</span><span class="p">,</span> <span class="ss">within: </span><span class="mi">10</span><span class="p">.</span><span class="nf">seconds</span><span class="p">,</span>
    <span class="ss">by: </span><span class="o">-&gt;</span> <span class="p">{</span> <span class="n">request</span><span class="p">.</span><span class="nf">domain</span> <span class="p">},</span> <span class="ss">with: </span><span class="o">-&gt;</span> <span class="p">{</span> <span class="n">redirect_to</span> <span class="n">busy_controller_url</span><span class="p">,</span> <span class="ss">alert: </span><span class="s2">"Too many signups!"</span> <span class="p">},</span> <span class="ss">only: :new</span>
<span class="k">end</span>
</code></pre></div></div>

<p><a href="https://github.com/rails/rails/pull/50914">Generate devcontainer files by default</a><br />
This change generates a <code class="language-plaintext highlighter-rouge">.devcontainer</code> folder and its contents when creating a new app.
The <code class="language-plaintext highlighter-rouge">.devcontainer</code> folder includes everything needed to <a href="https://containers.dev/">boot the app and do development in a remote container</a>.
These files can be skipped using the <code class="language-plaintext highlighter-rouge">--skip-devcontainer</code> option.</p>

<p><a href="https://github.com/rails/rails/pull/50796">Add customized prompt for Rails console</a><br />
Rails console now indicates the current Rails environment with the name and color (red for production).</p>

<p><a href="https://github.com/rails/rails/pull/51798">Add Kamal by default to Rails 8 </a><br />
This PR adds Kamal for deployment by default, which includes generating a Rails-specific <code class="language-plaintext highlighter-rouge">config/deploy.yml</code>.
This can be skipped using  <code class="language-plaintext highlighter-rouge">--skip-kamal</code>. Check out more about Kamal on its <a href="https://kamal-deploy.org/">official site</a>.</p>

<p><a href="https://github.com/rails/rails/pull/51799">Change asset pipeline default to Propshaft in Rails 8</a><br />
Sprockets has served us well, but it’s time to hand over the torch to <a href="https://github.com/rails/propshaft">Propshaft</a> in Rails 8.</p>

<p><a href="https://github.com/rails/rails/pull/52328">Add a basic sessions generator</a><br />
This change adds a new sessions generator to give a basic start to an authentication system using database-tracked sessions.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Generate with...</span>
bin/rails generate session

<span class="c"># Generated files</span>
app/models/current.rb
app/models/user.rb
app/models/session.rb
app/controllers/sessions_controller.rb
app/views/sessions/new.html.erb
db/migrate/xxxxxxx_create_users.rb
db/migrate/xxxxxxx_create_sessions.rb
</code></pre></div></div>

<p>The generator was later renamed to “authentication” generator and got a bunch of improvements.</p>

<p><a href="https://github.com/rails/rails/pull/52471">Implement new maintenance policy</a><br />
The Rails maintenance policy was updated this year. The main changes are:</p>
<ul>
  <li>Releases are maintained by a pre-defined, fixed period of time. One year for bug fixes and two years for security fixes.</li>
  <li>Distinction between severe security issues and regular security issues is removed.</li>
  <li>Npm versioning is updated to match not use the pre-release - separator.</li>
</ul>

<p><a href="https://github.com/rails/rails/pull/51793">Use Thruster by default for Rails 8</a><br />
<a href="https://github.com/basecamp/thruster/">Thruster</a> is an asset compression and caching proxy with X-Sendfile acceleration that speeds up simple production-ready deployments of Rails applications.
It runs alongside the Puma and usually behind the Kamal 2 proxy, which offers HTTP/2 and SSL auto-certificates,
to help your app run efficiently and safely on the open Internet.</p>

<p>This change configures the use of Thruster in the Dockerfile by default, starting with Rails 8.</p>

<p><a href="https://github.com/rails/rails/pull/52354">Add support for SQLite3 full-text search and other virtual tables</a><br />
SQLite3 full-text search and other virtual tables are now supported in Rails.
Previously, adding SQLite3 virtual tables messed up <code class="language-plaintext highlighter-rouge">schema.rb</code>, but with this change, virtual tables can safely be added using <code class="language-plaintext highlighter-rouge">create_virtual_table</code>.</p>

<p><a href="https://github.com/rails/rails/pull/52790">Add Solid Cache</a><br />
Solid Cache will be the new default caching backend for production deployments out of the box in Rails 8.</p>

<p><a href="https://github.com/rails/rails/pull/52804">Add Solid Queue</a><br />
Configure Solid Queue as the default Active Job backend alongside Solid Cache. Both can be skipped with <code class="language-plaintext highlighter-rouge">--skip-solid</code>.</p>

<p><a href="https://github.com/rails/rails/pull/52889">Add Solid Cable</a><br />
This change starts to use <a href="https://github.com/rails/solid_cable">Solid Cable</a> as the default Action Cable adapter in production, configured as a separate queue database in <code class="language-plaintext highlighter-rouge">config/database.yml</code>. 
It keeps messages in a table and continuously polls for updates.</p>

<p>This makes it possible to drop the common dependency on Redis, if it isn’t needed for any other purpose. 
Despite polling, the performance of Solid Cable is comparable to Redis in most situations. 
And in all circumstances, it makes it easier to deploy Rails when Redis is no longer a required dependency for Action Cable functionality.</p>

<p><a href="https://github.com/rails/rails/pull/52789">Silence healthcheck requests from the log</a><br />
Add <code class="language-plaintext highlighter-rouge">Rails::Rack::SilenceRequest</code> middleware and use it via <code class="language-plaintext highlighter-rouge">config.silence_healthcheck_path = path</code> to silence requests to “/up”.
This prevents the Kamal-required healthchecks from clogging up the production logs.</p>

<p><a href="https://github.com/rails/rails/pull/51674">Add Parameters#expect to safely filter and require params</a><br />
This PR adds a new way to handle params giving more control over what you expect to receive in your controller actions.</p>
<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Before</span>
<span class="n">params</span><span class="p">.</span><span class="nf">require</span><span class="p">(</span><span class="ss">:table</span><span class="p">).</span><span class="nf">permit</span><span class="p">(</span><span class="ss">:attr</span><span class="p">)</span>

<span class="c1"># After</span>
<span class="n">params</span><span class="p">.</span><span class="nf">expect</span><span class="p">(</span><span class="ss">table: </span><span class="p">[</span> <span class="ss">:attr</span> <span class="p">])</span>
</code></pre></div></div>

<p><a href="https://github.com/rails/rails/pull/53045">Tidy up the error pages</a><br />
The error pages built into Rails have been updated, here’s a preview of the new look:
<img width="1512" alt="Screenshot 2024-09-26 at 10 46 56 AM" src="https://github.com/user-attachments/assets/225dbc1f-309e-4f31-9da7-106f7d312424" /></p>

<p><a href="https://github.com/rails/rails/pull/53827">Support loading SQLite3 extensions</a><br />
The <em>sqlite3</em> gem v2.4.0 introduces support for loading extensions passed as a kwarg to <em>Database.new</em>. This PR leverages that feature to allow configuration of extensions in the <em>config/database.yml</em> file using either filesystem paths or the names of modules that respond to <em>to_path</em> method.</p>

<p><a href="https://github.com/rails/rails/pull/53065">Add ActiveSupport::Testing::NotificationAssertions test helper module</a><br />
With this addition, we can now use various test helper methods for notification assertions:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">assert_notification</span><span class="p">(</span><span class="s2">"post.submitted"</span><span class="p">,</span> <span class="ss">title: </span><span class="s2">"Cool Post"</span><span class="p">)</span> <span class="k">do</span>
  <span class="n">post</span><span class="p">.</span><span class="nf">submit</span><span class="p">(</span><span class="ss">title: </span><span class="s2">"Cool Post"</span><span class="p">)</span> <span class="c1"># =&gt; emits matching notification</span>
<span class="k">end</span>

<span class="n">assert_notifications_count</span><span class="p">(</span><span class="s2">"post.submitted"</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="k">do</span>
  <span class="n">post</span><span class="p">.</span><span class="nf">submit</span><span class="p">(</span><span class="ss">title: </span><span class="s2">"Cool Post"</span><span class="p">)</span>
<span class="k">end</span>

<span class="n">assert_no_notifications</span><span class="p">(</span><span class="s2">"post.submitted"</span><span class="p">)</span> <span class="k">do</span>
  <span class="n">post</span><span class="p">.</span><span class="nf">destroy</span>
<span class="k">end</span>

<span class="n">notifications</span> <span class="o">=</span> <span class="n">capture_notifications</span><span class="p">(</span><span class="s2">"post.submitted"</span><span class="p">)</span> <span class="k">do</span>
  <span class="n">post</span><span class="p">.</span><span class="nf">submit</span><span class="p">(</span><span class="ss">title: </span><span class="s2">"Cool Post"</span><span class="p">)</span> <span class="c1"># =&gt; emits matching notification</span>
<span class="k">end</span>
</code></pre></div></div>

<p><em>You can view the whole list of changes <a href="https://github.com/rails/rails/compare/@%7B2024-01-01%7D...main@%7B2024-12-31%7D">here</a>.</em>
<em>We had <a href="https://contributors.rubyonrails.org/contributors/in-time-window/20240101-20241231">555 contributors</a> to the Rails codebase this year!</em></p>

<p>Merry Christmas and a happy New Year! 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>Greg</name></author><category term="news" /><summary type="html"><![CDATA[This is Greg, Vipul, Wojciech, and Zzak, bringing you the summary of what happened with Rails in the past year. It was a busy year with close to 4000 commits from 555 contributors and 50 releases, including Rails 8!]]></summary></entry><entry><title type="html">Revert Active Model’s Normalization and Cache Store gets session ID uniqueness flag</title><link href="https://rubyonrails.org/2024/12/21/this-week-in-rails" rel="alternate" type="text/html" title="Revert Active Model’s Normalization and Cache Store gets session ID uniqueness flag" /><published>2024-12-21T00:00:00+00:00</published><updated>2024-12-21T00:00:00+00:00</updated><id>https://rubyonrails.org/2024/12/21/this-week-in-rails</id><content type="html" xml:base="https://rubyonrails.org/2024/12/21/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://github.com/rails/rails/pull/53962">Fix “#to_query” to not include setter for nil values</a><br />
To keep the behavior consistent with <code class="language-plaintext highlighter-rouge">Rack::Utils.parse_nested_query</code>.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Before
nil.to_query("key") #=&gt; key=
# After
nil.to_query("key") #=&gt; key
</code></pre></div></div>

<p><a href="https://github.com/rails/rails/pull/53961">Raise “ActiveRecordError” when “#increment!” called on new records</a><br />
Similar to the behavior of <code class="language-plaintext highlighter-rouge">#update_columns</code>, an exception will be raised on records that haven’t been saved yet or were destroyed.</p>

<p><a href="https://github.com/rails/rails/pull/53954">Revert “ActiveModel::Attributes::Normalization”</a><br />
In the last episode, we announced that <code class="language-plaintext highlighter-rouge">ActiveRecord::Normalization</code> was moved to Active Model.<br />
That PR was reverted because the API wasn’t ready and is still being worked on.</p>

<p><a href="https://github.com/rails/rails/pull/53946">Add “:comparable” option to serialized attributes</a><br />
This option was added to ease migration between different coders.<br />
Refer to the <a href="https://edgeapi.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Serialization/ClassMethods.html#method-i-serialize">API docs</a> for more information.</p>

<p><a href="https://github.com/rails/rails/pull/53929">Remove monkey patches of “Range#each” and “Range#step”</a><br />
Technically these methods are equivalent to the native Ruby methods, so they can be safely removed.</p>

<p><a href="https://github.com/rails/rails/pull/53918">Add “check_collisions” option to Cache Store</a><br />
This new options was added for situations where guaranteeing uniqueness of the session ID is required.</p>

<p><a href="https://github.com/rails/rails/pull/53623">Prevent Active Storage Blob from autosaving Attachments</a><br />
This change should have no impact on existing applications, but will ensure that adding an attachment to a record doesn’t automatically save it, causing other callbacks to run unexpectedly.</p>

<p><em>You can view the whole list of changes <a href="https://github.com/rails/rails/compare/@%7B2024-12-14%7D...main@%7B2024-12-21%7D">here</a>.</em>
<em>We had <a href="https://contributors.rubyonrails.org/contributors/in-time-window/20241214-20241221">24 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">2024 Wrap Up from the Rails Foundation</title><link href="https://rubyonrails.org/2024/12/18/wrap-up-2024-from-rails-foundation" rel="alternate" type="text/html" title="2024 Wrap Up from the Rails Foundation" /><published>2024-12-18T00:00:00+00:00</published><updated>2024-12-18T00:00:00+00:00</updated><id>https://rubyonrails.org/2024/12/18/wrap-up-2024-from-rails-foundation</id><content type="html" xml:base="https://rubyonrails.org/2024/12/18/wrap-up-2024-from-rails-foundation"><![CDATA[<p>It’s amazing how quickly a year flies by.</p>

<p>It’s a total cliché, but it feels like only a few days ago that I sat by my Christmas tree and wrote <a href="/2023/12/27/reflecting-on-2023">last year’s</a> final reflection post.</p>

<p>Back then, I was excited for all of the plans the Rails Foundation had in the works for 2024. Rails 7.1 was just released and already Rails 8 was on the horizon. There was so much to do! <em>Documentation! Tutorial! Videos! Toronto! Merch store! Case studies!</em> I couldn’t wait to hit the ground running and start assembling the teams to make all this happen.</p>

<p>…Then the motherboard in my new laptop died and I was forced to take the next week off until Apple provided a new one. I’m sure there was a ‘blessing in disguise’ lesson in there somewhere, but at the time I was too annoyed to see it.</p>

<p>I digress.</p>

<p>Now, one year later, seated again in the glow of my Christmas tree with a cautious eye on my <em>second</em> new laptop (don’t fail me now), I can look back and say with confidence that we did what we set out to do in 2024. Within two years the Rails Foundation has all 4 pillars of our mission up and running, and all pistons firing: Documentation, Education, Marketing, and Events.</p>

<p>And once again, I am looking ahead with excitement to next year. We have a lot in store, and I can’t wait to get started.</p>

<p>Before we sprint forward, I’d like to share all that we accomplished this year in support of our mission.</p>

<p><strong>But first: the Rails Foundation grew this year.</strong></p>

<p>The Rails Foundation expanded this year when <a href="/2024/12/2/rails-foundation-welcomes-1password-as-core-member"><strong>1Password</strong> joined as a brand new Core member</a>. This is huge news for the Rails community that such a well-known SaaS company (and beloved tool) is so enthusiastic about Rails that they are contributing at our highest tier of membership. And not a Rails shop <em>by origin</em>, I might add, but rather a Rails shop <em>by acquisition</em>. That speaks <em>volumes</em> about Rails.</p>

<p>VP of Product at 1Password <strong>Jason Meller</strong> joined the Rails Foundation board as a director. On the Remote Ruby podcast recently, he shared more about how this all came to be when his company Kollide was acquired by 1Password, and how joining the foundation took little convincing internally: “<em>It felt like the right time for 1Password to step in and start getting formally involved in the community. It was a no-brainer. <strong>Instantly everybody saw the value.</strong></em>” (It’s a great episode, listen to it <a href="https://www.remoteruby.com/2260490/episodes/16235279-jason-meller-on-1password-joining-the-rails-foundation">here</a>.)</p>

<p><a href="https://1password.com/">1Password</a> joins the eight founding members of the Rails Foundation Core, all of which have a seat on the board: <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://www.procore.com">Procore</a>, <a href="https://www.shopify.com">Shopify</a>, and <a href="https://37signals.com">37signals</a>.</p>

<p>Other changes to the board included <strong>Neha Batra</strong> stepping in as GitHub’s director, and <strong>Ryan Sherlock</strong> taking over the director role for Intercom. (Big thanks to <strong>Kyle Daigle</strong> and <strong>Darragh Curran</strong>, who previously acted as directors before passing the baton.)</p>

<p>The Rails Foundation also welcomed three new Contributing members this year: <a href="https://makandra.de/"><strong>makandra</strong></a>, <a href="https://tablecheck.com/en/join"><strong>TableCheck</strong></a>, and <a href="https://gusto.com/"><strong>Gusto</strong></a>, joining <a href="https://www.cedarcode.com">Cedarcode</a>, <a href="https://www.planetargon.com">Planet Argon</a>, <a href="https://www.appsignal.com">AppSignal</a>, <a href="https://www.bigbinary.com">BigBinary</a>, and <a href="https://www.renuo.ch/">Renuo</a>.</p>

<p>This year has been an incredible show of support for the Rails community. All of the companies you see above not only fund the work we are doing, they also advise, suggest ideas, contribute time, and share resources - all because they believe in our mission to support the Rails community and want to see it thrive for decades to come.</p>

<p>Our work is 100% made possible because of the ongoing support by these members. Here’s a look back on what that support meant for you in the Rails community in 2024.</p>

<p><strong>We updated the Rails Guides.</strong> (<em>Documentation</em>)</p>

<p>Work on the Rails documentation began in <a href="/2024/2/6/documentation-update-work-has-begun">February</a>, and carried on throughout the year. In total, <a href="https://github.com/rails/rails/issues?q=label%3A%22rails+foundation%22+is%3Aclosed+RF-DOCS">21 guides</a> were updated, including the addition of most of the recent Rails 8 defaults.</p>

<p>These guides are now up-to-date and more consistent in tone, content, context, and readability, thanks to the efforts of <strong>Ridhwana Khan</strong>, <strong>Bhumi Shah</strong>, <strong>Harriet Oughton</strong>, <strong>Petrik de Heus</strong>, <strong>Carlos Antonio Da Silva</strong>, and the many, many folks in the community who helped by reviewing the PRs. There is more work to do here, but we are off to a good start.</p>

<p><strong>We improved the design &amp; UX of the Rails Guides.</strong> (<em>Documentation</em>)</p>

<p>The previous design of the Rails Guides served its purpose well for nearly 15 years, but it’s just as important for the UX and design of a website to evolve along with the framework it promotes. So this year, we fixed that and <a href="/2024/3/20/rails-guides-get-a-facelift">gave the Guides a facelift</a> so that visitors will see a more clean, sleek, and modern design, more in keeping with what Rails is today.</p>

<p><strong>John Athayde</strong> refreshed the existing design, added RTL rendering, and added convenient little UX features such as a floating, scrollable Chapters nav bar, and a guide version selector (a crowd favorite). <strong>Alisa Wandzilak</strong> added a highlight to the rolling scrollbar, and <strong>Derk-Jan Karrenbeld</strong> did a lot of work to improve the accessibility of the guides. All of this work was carried out with feedback and direction from the three <strong>Rails teams</strong>, and a lot of help from the community. Thank you all!</p>

<p><strong>We introduced Rails case studies.</strong> (<em>Marketing - Documentation</em>)</p>

<p>What better way to demonstrate that Rails is the ideal choice for building fast, flexible, and scalable applications than with <a href="/2024/12/12/introducing-doximity-case-study">case studies</a> showcasing how companies like <a href="/docs/case-studies/doximity">Doximity</a> have successfully done so?</p>

<p>The Rails community is rich with stories of successful companies of all sizes, building with Rails and delivering big results - it’s time to start sharing these stories with the world.</p>

<p>This case study was a collaboration made possible by <strong>Robby Russell</strong> from Planet Argon, <strong>Bruno Miranda</strong> from Doximity, and the <strong>Doximity leadership team</strong>.</p>

<p><strong>We shipped a brand new flagship Getting Started tutorial.</strong> (<em>Education</em>)</p>

<p>With Rails 8, the framework is better than ever, making it the perfect time to introduce a new flagship Getting Started tutorial that showcases everything Rails can do.</p>

<p>The revamped <a href="https://guides.rubyonrails.org/getting_started.html">Getting Started Guide</a> now walks you through building an e-commerce app and is the most up-to-date, comprehensive Rails 8 tutorial to be found, introducing Rails fundamentals and the latest Rails 8 defaults.</p>

<p>We also made it more beginner-friendly, designed to make Rails accessible to everyone and to welcome beginners to Rails for years to come. And: it’s expandable, so get ready for more tutorials in the future.</p>

<p>Special thanks to <strong>Chris Oliver</strong> for his work on this tutorial, with help from <strong>Rafael França</strong>, <strong>Xavier Noria</strong>, <strong>Jeremy Daer</strong>, <strong>Matthew Draper</strong>, <strong>Collin Jilbert</strong>, <strong>Kent Crutchfield</strong>, <strong>Harriet Oughton</strong>, <strong>Julian Duss</strong>, <strong>Santiago Rodriguez</strong>, <strong>Gianlo Occhipinti</strong>, <strong>Kim Perino</strong>, and all the reviewers on GitHub.</p>

<p><strong>We introduced the Docs landing page.</strong> (<em>Documentation</em>)</p>

<p>To create space for tutorials and case studies, and to make the Rails website more welcoming and beginner-friendly to navigate, <a href="/2024/12/17/introducing-new-docs-landing-page">we introduced Docs</a>, the starting point for everything you need to install Rails, learn it, get better at it, and get involved. From <a href="/docs">one convenient page</a>, you can now access the Installation Guide, Tutorials, Guides, API Docs, Case Studies, the Forum, and the Contributing Guide.</p>

<p><strong>John Athayde</strong> designed and shipped this new page with input and direction from all three Rails teams.</p>

<p><strong>We collaborated with Typecraft on the Rails 8 Unpacked video series.</strong> (<em>Education - Marketing</em>)</p>

<p>DHH recorded a new Rails 8 <a href="https://youtu.be/X_Hw9P1iZfQ">demo</a> for the website which is a fantastic upgrade on the previous demo - now showing how easy it is to take an app from <code class="language-plaintext highlighter-rouge">rails new</code> all the way through to deployment - all within 30 minutes.</p>

<p>But we wanted to dive deeper. We wanted videos that answered the questions you probably had: what was introduced as default or new in Rails 8, what does that change, and why does it matter?</p>

<p>But who could tell the story in a compelling, engaging way?</p>

<p>The answer came to us at Rails World when I found myself seated next to Chris Power of the popular YouTube channel Typecraft after the Opening Keynote. “Hey,” he said, “This Rails 8 stuff is so cool. Who do I speak to about creating content for Rails?”.</p>

<p><em>Bingo.</em></p>

<p><a href="https://www.youtube.com/playlist?list=PLHFP2OPUpCebdA4-xR07SPpoBWVERkHR6">Rails 8 Unpacked with Typecraft</a> is a 9-part video series exploring Rails 8’s default features through the lens of a demo task management app. It’s told with the right blend humor, panache, and expertise befitting the Ruby community, and we hope you like it.</p>

<p>Thanks to <strong>Chris Power</strong> and <strong>Robert Beene</strong> from Typecraft for pulling this series together in record time after Rails 8 was launched, with help from reviewers <strong>Rosa Gutiérrez</strong>, <strong>Donal McBreen</strong>, <strong>Breno Gazzola</strong>, <strong>Miles Woodroffe</strong>, <strong>Bruno Miranda</strong>, and the <strong>Rails Core</strong> team.</p>

<p><strong>We kicked off the Rails in Focus video series.</strong> (<em>Education - Marketing</em>)</p>

<p><a href="https://youtu.be/TZXj-LITY2E">Rails in Focus</a> is a video series of quick tips and best practices for Rails devs of all levels to help you get the most out of Rails.</p>

<p>These videos are made by the community, for the community. <strong>Emmanuel Hayford</strong> is our first host for the series, but there will be more hosts as the mic is passed to other Rails devs. What feature of Rails do you love working with? What little-known tip has helped you? If you have something to share and want to host, please <a href="https://shorturl.at/CecD6">get in touch</a>. And subscribe to the <a href="https://www.youtube.com/@railsofficial">Rails YouTube</a> to be notified of when more videos drop.</p>

<p><strong>We sponsored Rails Girls São Paulo.</strong> (<em>Events</em>)</p>

<p>After being asked to speak on a panel at Tropical on Rails, the Rails Foundation teamed up with Doximity to sponsor the coinciding <a href="/2024/2/27/rails-foundation-doximity-sponsor-rails-girls-sao-paolo">Rails Girls São Paulo</a>, which was starting up again after a hiatus with a new format to help women with some level of Rails experience gain skills to advance further in their career.</p>

<p>On a break from working on their demo apps, the 30 attendees had a chance to ask Rails Core <strong>Eileen Uchitelle</strong>, Shopify Engineering Manager <strong>Gabi Stefanini</strong>, Rails dev <strong>Mayra Navarro</strong>, and myself questions and tips on how to succeed in tech and advance in their careers.</p>

<p>Foundation members <strong>Bruno Miranda</strong> (Doximity) and <strong>Robby Russell</strong> (Planet Argon) and I were grateful for an opportunity to spend time with such a fantastic group of women from the Brazilian Rails community. Thank you to <strong>Debora Fernandes</strong>, <strong>Camila Campos</strong>, and <strong>Cirdes Henrique</strong> for organizing and inviting us, and Doximity’s <strong>Douglas Andrade</strong>, <strong>Camila Tormena</strong>, <strong>Julio Monteiro</strong> and <strong>David Bruisius</strong> for mentoring the teams.</p>

<p><strong>We launched the Rails Merch Store.</strong> (<em>Marketing - Community</em>)</p>

<p>Many of you asked over the past two years, so we finally launched the official <a href="https://merch.rubyonrails.org/">Rails Merch Store</a>, starting with timeless classic items - t-shirt, hoodie, cap, mug, and a baby onesie. We’ll be adding more items over time, and we hope to add shipping to more regions as soon as possible.</p>

<p>We can’t wait to see you out in the wild wearing your Rails pride! (Don’t forget to tag Rails in your shots on social media.)</p>

<p>This looks like a small merch store, but it took some heavy lifting to get it live, and it would not have happened without <strong>Anne Gonschorek</strong>, <strong>Melissa Miller</strong>, <strong>Jackie Gregoire</strong>, and <strong>Lukas Perez</strong>, <strong>Brandon Sooknanan</strong>, <strong>Niklas Arsenault</strong> from Shopify’s launch team (because the merch store is built on Shopify).</p>

<p><strong>We gathered 1,000 devs in Toronto for Rails World.</strong> (<em>Events - Marketing - Education - Community</em>)</p>

<p>Rails devs from 57 countries gathered in Toronto for the second edition of Rails World. We had two days of technical talks, workshops, networking, and evening parties, and folks were live in the audience when the <a href="/2024/9/27/rails-8-beta1-no-paas-required">Rails 8 beta</a> was released to the world <a href="https://youtu.be/-cEn_83zRFw?si=u59AqcCX2egnh3AM&amp;t=3651">during the Opening Keynote</a>.</p>

<p>This was a memorable edition in a beautiful venue that was made possible by support from many sponsors, but especially by our three primary supporters: Platinum sponsors <strong>AppSignal</strong> and <strong>GitHub</strong>, and our City Host <strong>Shopify</strong>, who was excited to host us in their hometown.</p>

<p>There’s a lot that comes together during an event; this is just some of what went down this year:</p>

<ul>
  <li>The <strong>Rails Core</strong> team had their second ever offsite - meeting all day to discuss the direction of the framework, and enjoying a private dinner together at night before Rails World activity kicked off. This year 11 of the 12 members were in attendance.</li>
  <li>Shopify CEO <strong>Tobi Lütke</strong> invited <strong>DHH</strong> and <strong>Matz</strong> to a fireside chat on Ruby, Rails, and the joy of working with both.</li>
  <li>DHH surprised <strong>Matz</strong> with his first-ever award - the Rails Lifetime Award, and Xavier Noria awarded <strong>Akira Matsuda</strong> from the Rails Committers team with the 2024 Rails Luminary Award. Read about both award winners <a href="/2024/9/27/2024-rails-luminary-awards-matz-and-akira">here</a>.</li>
  <li><strong>Clio</strong> and the <strong>Toronto Ruby</strong> meetup group co-hosted an awesome Day 1 party.</li>
  <li><strong>Shopify</strong> hosted the a Lightning Track, allowing 14 attendees to give quick talks on topics from gaming to Hotwire Native.</li>
  <li><strong>Buzzsprout</strong> hosted the podcast booth once again, allowing 6 podcasts in our community to record as many interviews as they could and take advantage of having 1,000 Rails devs all in one space.</li>
  <li><strong>Telos Labs</strong> created and open-sourced <a href="/2024/8/1/building-the-rails-world-app-with-telos-labs">an event app</a> for the entire community that we used for creating our agendas and getting notified when our next session was starting.</li>
  <li><strong>Shopify</strong> closed out Rails World with an epic party spanning three floors of fun—food, drinks, games, and music overlooking the skyline of Toronto.</li>
</ul>

<p>There were also wasps, but we don’t talk about them.</p>

<p>Huge shout out to all of the <a href="https://rubyonrails.org/world/2024/speakers">speakers</a> who presented this year, and everyone who made the Hallway Track as special and engaging as ever.</p>

<p>The Toronto edition will be hard to top, but we’re certainly going to try <a href="/2024/11/27/rails-world-2025-save-the-date">next year in Amsterdam</a>.</p>

<p><strong>And last but not least, we localized videos in 3 languages.</strong> (<em>Marketing - Education - Community</em>)</p>

<p>Thanks to <a href="https://www.happyscribe.com/">Happy Scribe</a>, a transcription service built on Rails, we were able to offer <strong>Japanese</strong>, <strong>Brazilian Portuguese</strong>, and <strong>Spanish</strong> subtitles on all 24 Rails World 2024 videos, and all 9 Rails Unpacked videos. We hope this removes a barrier and makes Rails videos accessible to a wider audience of developers and Rails enthusiasts around the world.</p>

<p><strong>That’s a wrap on 2024.</strong></p>

<p>Like I said at the start, we achieved everything we set out to do in 2024, and that feels good. But all this work is just the blast of the starting gun.</p>

<p>Next year, all of it continues: more tutorials, more videos, more supporting whatever updates the Rails Core team has in store for you, and of course, another Rails World to start planning.</p>

<p>By the way, we have added a <a href="https://rubyonrails.org/category/foundation">Foundation category</a> to the blog feed. Drop in any time throughout the year to see what we are working on. (Thank you <strong>Beatriz Mitre</strong> for adding that functionality.) Our <a href="https://app.todohelpers.com/forms/4758b5b0-d6f9-4f41-8041-992cc9b748fb">suggestion box</a> is also always open if you have ideas on how we can support you.</p>

<p><strong>To close, one more thing.</strong></p>

<p>Thank you all for your enthusiasm and energy. Not only does it make working for this community fun and exciting, but over the past year, I’ve heard from countless developers from other communities and languages who recognize that something <strong>special is happening in Rails</strong>. That’s a testament to the Rails community’s genuine passion and excitement for the future. It’s enough positivity and pride to make others sit up and notice, and that’s powerful stuff.</p>

<p>So let’s keep the momentum going in 2025. Let’s continue making waves and showing the tech world what Rails is all about.</p>

<p>Wishing everyone in the Rails community a fantastic close to 2024. See you all next year!</p>]]></content><author><name>Amanda Perino</name></author><category term="news," /><category term="foundation" /><summary type="html"><![CDATA[It’s amazing how quickly a year flies by.]]></summary></entry><entry><title type="html">Introducing the new Docs landing page</title><link href="https://rubyonrails.org/2024/12/17/introducing-new-docs-landing-page" rel="alternate" type="text/html" title="Introducing the new Docs landing page" /><published>2024-12-17T00:00:00+00:00</published><updated>2024-12-17T00:00:00+00:00</updated><id>https://rubyonrails.org/2024/12/17/introducing-new-docs-landing-page</id><content type="html" xml:base="https://rubyonrails.org/2024/12/17/introducing-new-docs-landing-page"><![CDATA[<p>Last week, we published a bunch of <a href="https://rubyonrails.org/2024/12/12/introducing-doximity-case-study">new</a> and <a href="https://rubyonrails.org/2024/12/13/learn-Rails-8-tutorial-and-unpacked-videos">updated</a> resources to help you learn Rails and learn how companies leverage Rails to build successful businesses. But we also made a few structural and navigational changes to the website that you may not have noticed (yet).</p>

<p><strong>The challenge: lots of resources, little space</strong></p>

<p>Earlier this year, we had big plans:</p>
<ul>
  <li>Create a new flagship tutorial (with more planned soon).</li>
  <li>Extract the Rails installation instructions from the tutorial into a standalone Installation Guide (because you shouldn’t have to find this information buried in chapter 3 of a tutorial).</li>
  <li>Publish the first case study (with more planned soon).</li>
  <li>On top of all that, launch a merch store.</li>
</ul>

<p>We were excited that all this was coming, but the navbar was already quite crowded…<em>where were all these new resources going to live?</em></p>

<p><strong>The solution: a unified Docs landing page</strong></p>

<p>Introducing <strong><a href="/docs">Docs</a></strong>, the friendly new starting point for everything you need to install Rails, learn it, get better at it, and get involved.</p>

<p>From one convenient page, you can now access the following: Installation Guide, Tutorials, Guides, API Docs, Case Studies, the Forum, and the Contributing Guide.</p>

<p><img src="/assets/images/docs-landing-page.png" /></p>

<p>Other changes you might notice in the navbar:</p>
<ul>
  <li>We’ve renamed ‘Contribute’ to <strong>Source</strong> to clarify the difference between the GitHub repository and the Contributing Guide. (We also made the <strong>Contributing Guide</strong> easier to find. Rails is an open-source project, but this important info was buried 85% down the Guides index page. It’s now featured more prominently on the Docs landing page.)</li>
  <li>‘Team’ is now called <strong>Community</strong>, where you can find all of the Rails teams and the Contributors site. This renaming also balances out the navbar.</li>
  <li>The ‘Blog’ is now called <strong>News</strong> since it also contains Rails Foundation news alongside Rails updates and This Week in Rails newsletters.</li>
  <li>With <strong>Guides</strong>, <strong>API docs</strong>, and the <strong>Forum</strong> now nested under <strong>Docs</strong>, this gave us room in the navbar to add 
<strong>Merch</strong> and <strong>Events</strong>.</li>
</ul>

<p>These changes aim to make the Rails website more welcoming and friendly-to-navigate for beginners, while helping you, as a more experienced Rails dev, find what you need quickly. This (re)structure also gives the Rails Foundation a clear home for future tutorials and case studies, so expect more of those released next year.</p>

<p><a href="/docs">Take a look at the new Docs page</a> and let us know what you think!</p>

<p>The Docs landing page was designed and shipped by <a href="https://www.meticulous.com/">John Athayde</a> with feedback and direction from the <strong>Rails Core</strong>, <strong>Issues</strong>, and <strong>Committers</strong> teams, and made possible by the support of the <strong>members of the Rails Foundation</strong>. Thank you to everyone involved for your input!</p>]]></content><author><name>Amanda Perino</name></author><category term="news," /><category term="foundation" /><summary type="html"><![CDATA[Last week, we published a bunch of new and updated resources to help you learn Rails and learn how companies leverage Rails to build successful businesses. But we also made a few structural and navigational changes to the website that you may not have noticed (yet).]]></summary></entry><entry><title type="html">The official Rails merch store is live</title><link href="https://rubyonrails.org/2024/12/16/rails-merch-store-is-live" rel="alternate" type="text/html" title="The official Rails merch store is live" /><published>2024-12-16T00:00:00+00:00</published><updated>2024-12-16T00:00:00+00:00</updated><id>https://rubyonrails.org/2024/12/16/rails-merch-store-is-live</id><content type="html" xml:base="https://rubyonrails.org/2024/12/16/rails-merch-store-is-live"><![CDATA[<p>It’s been a long time coming, many of you have asked for it, and now the wait is over. Today the official Rails merch store launches in the United States and Canada!</p>

<p><a href="https://merch.rubyonrails.org/">Explore the first collection here.</a></p>

<p>The first collection is <strong>simple</strong> and <strong>classic</strong>: high-quality and comfortable t-shirts and hoodies, a travel mug, a cap, and a Rails baby onesie for your tiny future programmer. But this is just the beginning. Stay tuned for more designs and items coming soon.</p>

<p>By wearing Rails merch, you’re not just showing support for Rails as a framework; you’re also celebrating being part of an open-source community that has continued to thrive for more than two decades.</p>

<p>We can’t wait to see you out in the wild wearing your Rails pride! (Bonus points for tagging Rails in your shots on social media.)</p>

<p><img src="/assets/images/Rails-merch.png" /></p>

<p>Note: Items are priced as close to production cost as possible, meaning there’s no markup. Any small profit from the store will go directly back into the Rails Foundation’s mission of improving the documentation, education, marketing, and events in the Rails community to the benefit of all new and existing Rails developers.</p>

<p><strong>Fun facts:</strong></p>

<ul>
  <li>The Rails merch store is built on Shopify, because Shopify is built on Rails.</li>
  <li>The models are also from the Rails community - two are volunteers from Le Wagon, the largest Rails bootcamp in Europe, and the baby is the daughter of a Rails dev Max Chernyak.</li>
</ul>

<p><strong>Why just the US and Canada?</strong></p>

<p>We know many Rails developers outside the US and Canada are eager for Rails merch. Unfortunately, launching an online retail store involves challenges like production, warehousing, fulfillment, taxes, and shipping, and right now, we haven’t found an international solution that’s both cost-effective and maintains the high quality and low prices we aim for. But we’re working on it and hope to expand to more regions in the future. Thank you for your patience!</p>

<p><img src="/assets/images/Rails-merch-in-the-wild.png" /></p>]]></content><author><name>Amanda Perino</name></author><category term="news," /><category term="foundation" /><summary type="html"><![CDATA[It’s been a long time coming, many of you have asked for it, and now the wait is over. Today the official Rails merch store launches in the United States and Canada!]]></summary></entry><entry><title type="html">New Rails Tutorial and Unpacked Videos, Releases, ActiveModel::Attributes::Normalization and more!</title><link href="https://rubyonrails.org/2024/12/14/this-week-in-rails" rel="alternate" type="text/html" title="New Rails Tutorial and Unpacked Videos, Releases, ActiveModel::Attributes::Normalization and more!" /><published>2024-12-14T00:00:00+00:00</published><updated>2024-12-14T00:00:00+00:00</updated><id>https://rubyonrails.org/2024/12/14/this-week-in-rails</id><content type="html" xml:base="https://rubyonrails.org/2024/12/14/this-week-in-rails"><![CDATA[<p>Hey everyone, Happy Saturday!</p>

<p><a href="https://www.saeloun.com/team/vipul">Vipul</a> here with the latest updates for This Week in Rails. Let’s dive in!</p>

<p>This week, the Rails Foundation released a series of updated resources to help you learn the new Rails 8 defaults, 
including a brand new <a href="https://guides.rubyonrails.org/getting_started.html">Getting Started Tutorial</a>, 
a <a href="https://www.youtube.com/watch?v=Qw_Um-tMiYI&amp;list=PLHFP2OPUpCebdA4-xR07SPpoBWVERkHR6">9-part video series on YouTube</a>, 
and updated Rails Guides.</p>

<p><a href="https://rubyonrails.org/2024/12/13/learn-Rails-8-tutorial-and-unpacked-videos">Read the announcement here</a>.
The <a href="https://edgeguides.rubyonrails.org/install_ruby_on_rails.html">Installation Guide</a> has also been decoupled so it is easier to find, 
and includes the basics of installing Ruby with a version manager - arguably one of the biggest barriers to newcomers.</p>

<p><a href="https://rubyonrails.org/2024/12/10/Rails-Versions-8-0-0-1-7-2-2-1-7-1-5-1-7-0-8-7-have-been-released">Rails Versions 7.0.8.7, 7.1.5.1, 7.2.2.1, and 8.0.0.1 have been released!</a> <br />
These are security patches addressing one new issue where using the <code class="language-plaintext highlighter-rouge">content_security_policy</code> helper with untrusted user input could lead to a bypass of the browser Content Security Policy.</p>

<p><a href="https://rubyonrails.org/2024/12/13/Rails-Version-8-0-1-has-been-released">Rails Version 8.0.1 has been released!</a><br />
A new minor release - 8.0.1, is also out! Head over the <a href="https://github.com/rails/rails/releases/tag/v8.0.1">CHANGELOG</a>, to check the full set of changes in this release.</p>

<p><a href="https://rubyonrails.org/docs/case-studies/doximity">Doximity Case Study - Fast, Flexible, and Scalable</a><br />
We also have a new official case study in! Check out how Rails powers Doximity’s Healthcare Platform.
Here are some Highlights from the study:</p>

<ul>
  <li>Rails accelerates development: Doximity’s team rapidly iterates on new products and features, helping doctors save time and focus on patient care.</li>
  <li>Rails ensures long-term stability: By maintaining and evolving their 15-year-old monolith, Doximity avoids rewrites.</li>
  <li>Rails scales with success: As Doximity grows, Rails helps optimize the performance of 45+ applications and handle increasing traffic with ease.</li>
</ul>

<p><a href="https://github.com/rails/rails/pull/53859">Accept a block for <code class="language-plaintext highlighter-rouge">ActiveJob::ConfiguredJob#perform_later</code></a><br />
This pull request adds support for accepting a block for <code class="language-plaintext highlighter-rouge">ActiveJob::ConfiguredJob#perform_later</code>. 
This was previously inconsistent with a regular <code class="language-plaintext highlighter-rouge">ActiveJob::Base#perform_later</code>.</p>

<p><a href="https://github.com/rails/rails/pull/53863">Fix <code class="language-plaintext highlighter-rouge">if_exists</code>/<code class="language-plaintext highlighter-rouge">if_not_exists</code> for foreign keys addition and removal</a><br />
This PR addresses a few improvements with foreign keys additions/removals and <code class="language-plaintext highlighter-rouge">if_exists/if_not_exists</code>:</p>
<ul>
  <li>If there is a foreign key on a custom column and <code class="language-plaintext highlighter-rouge">add_foreign_key</code> on a default column with <code class="language-plaintext highlighter-rouge">if_not_exists</code> is used, an error was raised.</li>
  <li>When adding a foreign key with <code class="language-plaintext highlighter-rouge">if_not_exists</code>, <code class="language-plaintext highlighter-rouge">:primary_key</code> was not considered.</li>
  <li>When removing a foreign key with <code class="language-plaintext highlighter-rouge">if_exists</code>, custom column was not being considered.</li>
</ul>

<p><a href="https://github.com/rails/rails/pull/53838">Changing column nullability does not change default function</a><br />
This Pull Requests fixes <code class="language-plaintext highlighter-rouge">MySQL</code> default functions getting dropped when changing a column’s nullability.</p>

<p><a href="https://github.com/rails/rails/pull/53887">Migrate <code class="language-plaintext highlighter-rouge">ActiveRecord::Normalization</code> to Active Model</a><br />
<code class="language-plaintext highlighter-rouge">ActiveRecord::Normalization</code> has now been moved to Active Model.
This change backports <code class="language-plaintext highlighter-rouge">ActiveRecord::Normalization</code> to <code class="language-plaintext highlighter-rouge">ActiveModel::Attributes::Normalization</code>. 
With this change we can now use this feature in PORO with <code class="language-plaintext highlighter-rouge">ActiveModel::Attributes::Normalization</code> -</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">User</span>
  <span class="kp">include</span> <span class="no">ActiveModel</span><span class="o">::</span><span class="no">Attributes</span>
  <span class="kp">include</span> <span class="no">ActiveModel</span><span class="o">::</span><span class="no">Attributes</span><span class="o">::</span><span class="no">Normalization</span>

  <span class="n">attribute</span> <span class="ss">:email</span><span class="p">,</span> <span class="ss">:string</span>

  <span class="n">normalizes</span> <span class="ss">:email</span><span class="p">,</span> <span class="ss">with: </span><span class="o">-&gt;</span> <span class="n">email</span> <span class="p">{</span> <span class="n">email</span><span class="p">.</span><span class="nf">strip</span><span class="p">.</span><span class="nf">downcase</span> <span class="p">}</span>
<span class="k">end</span>

<span class="n">user</span> <span class="o">=</span> <span class="no">User</span><span class="p">.</span><span class="nf">new</span>
<span class="n">user</span><span class="p">.</span><span class="nf">email</span> <span class="o">=</span> <span class="s2">" CRUISE-CONTROL@EXAMPLE.COM</span><span class="se">\n</span><span class="s2">"</span>
<span class="n">user</span><span class="p">.</span><span class="nf">email</span> <span class="c1"># =&gt; "cruise-control@example.com"</span>
</code></pre></div></div>

<p><a href="https://github.com/rails/rails/pull/53847">Change <code class="language-plaintext highlighter-rouge">ActionText::RichText#embeds</code> assignment to <code class="language-plaintext highlighter-rouge">before_validation</code></a><br />
Prior to this change, assignment to the <code class="language-plaintext highlighter-rouge">embeds</code> association happened <strong>after</strong> validation callbacks, so it wasn’t possible to incorporate Rich Text-related file validation.</p>

<p><a href="https://github.com/rails/rails/pull/53882">SQLite3: Use default function as default insert value</a><br />
Previously, if a column defined a function as its default value, the function would never be called during fixture insertion. It now works as expected with this addition.</p>

<p><em>You can view the whole list of changes <a href="https://github.com/rails/rails/compare/@%7B2024-12-07%7D...main@%7B2024-12-13%7D">here</a>.</em>
<em>We had <a href="https://contributors.rubyonrails.org/contributors/in-time-window/20241207-20241213">41 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[Hey everyone, Happy Saturday!]]></summary></entry><entry><title type="html">Rails Version 8.0.1 has been released!</title><link href="https://rubyonrails.org/2024/12/13/Rails-Version-8-0-1-has-been-released" rel="alternate" type="text/html" title="Rails Version 8.0.1 has been released!" /><published>2024-12-13T08:57:00+00:00</published><updated>2024-12-13T08:57:00+00:00</updated><id>https://rubyonrails.org/2024/12/13/Rails-Version-8-0-1-has-been-released</id><content type="html" xml:base="https://rubyonrails.org/2024/12/13/Rails-Version-8-0-1-has-been-released"><![CDATA[<p>Hi everyone,</p>

<p>I am happy to announce that Rails 8.0.1 has been released.</p>

<h2 id="changes-since-800">CHANGES since 8.0.0</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.1">8.0.1 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.1/actioncable/CHANGELOG.md">Action Cable CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.0.1/actionmailbox/CHANGELOG.md">Action Mailbox CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.0.1/actionmailer/CHANGELOG.md">Action Mailer CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.0.1/actionpack/CHANGELOG.md">Action Pack CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.0.1/actiontext/CHANGELOG.md">Action Text CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.0.1/actionview/CHANGELOG.md">Action View CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.0.1/activejob/CHANGELOG.md">Active Job CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.0.1/activemodel/CHANGELOG.md">Active Model CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.0.1/activerecord/CHANGELOG.md">Active Record CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.0.1/activestorage/CHANGELOG.md">Active Storage CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.0.1/activesupport/CHANGELOG.md">Active Support CHANGELOG</a></li>
  <li><a href="https://github.com/rails/rails/blob/v8.0.1/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.0...v8.0.1">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.1:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ shasum -a 256 *-8.0.1.gem
f911dd3df2fd265e43980a591d280736989b22017847868cbb657afad5b2b5f3  actioncable-8.0.1.gem
9c98ecfebafb2791b8147e03ab4271bff2f6ef09c84afe18f926b445bf1394ee  actionmailbox-8.0.1.gem
532e12d22473b95cb29ae93661140bf64286e50386dbbb4addca8a4271a6a3fe  actionmailer-8.0.1.gem
287e798e9239b84f2744779e48e75c8c2ea3a4f22fd4c68d91f6d92fe0e14600  actionpack-8.0.1.gem
903acdefac9a80db4e14adb6c4324af6c07e51c65e9f2714f72ebf87477cf978  actiontext-8.0.1.gem
3e41bebeee9bdcb8577c19d7bf19efa50ab60838cbafcd00c3c4c9c675bcffd9  actionview-8.0.1.gem
d5bc2a03ecbe6e5a4192b49c478835d1028d166716766b5bdf5f35a32fc5fbc1  activejob-8.0.1.gem
030677d69abb84e8f6fb3a81fb48d9e612635d8cc1b2ebd67b816f2f7ddf7cad  activemodel-8.0.1.gem
a10beb8cb7066c2aa6a70c22ad0fb600ad4aac0d06381f2d8320ff48b2ead6c7  activerecord-8.0.1.gem
0e7d4a340d95aa6a3c35dfc1ed52ce8008a690a5ac538d853c956698818c3bd0  activestorage-8.0.1.gem
ab5561f80c34e613dec882fe77df5d78abd3b632e53116a35ef4490f814034b3  activesupport-8.0.1.gem
feef256282bc91e6e4665cb4cd7fe888bc838e8e176b8fc1f5c84ef638005384  rails-8.0.1.gem
516ab68b8110392581bd4ae506a86600278c046571c9b80ca2b54da69c4ac5f2  railties-8.0.1.gem
</code></pre></div></div>

<p>As always, huge thanks to the many contributors who helped with this release.</p>]]></content><author><name>rafaelfranca</name></author><category term="releases" /><summary type="html"><![CDATA[Hi everyone,]]></summary></entry><entry><title type="html">Want to learn about Rails 8? START HERE.</title><link href="https://rubyonrails.org/2024/12/13/learn-Rails-8-tutorial-and-unpacked-videos" rel="alternate" type="text/html" title="Want to learn about Rails 8? START HERE." /><published>2024-12-13T00:00:00+00:00</published><updated>2024-12-13T00:00:00+00:00</updated><id>https://rubyonrails.org/2024/12/13/learn-Rails-8-tutorial-and-unpacked-videos</id><content type="html" xml:base="https://rubyonrails.org/2024/12/13/learn-Rails-8-tutorial-and-unpacked-videos"><![CDATA[<p>Rails 8 is a major milestone, and for the first time in Rails’ history, thanks to the support of the members of the <a href="/foundation">Rails Foundation</a>, we are able to support this major release with new and updated tutorials, videos, and guides to help developers learn Rails’ new default features as quickly as possible.</p>

<p>If you want to learn more, here’s where you should start.</p>

<p><strong>The (new) Getting Started Tutorial</strong></p>

<p>The revamped Getting Started Guide walks you through building an e-commerce site while introducing Rails fundamentals and the latest Rails 8 defaults. Learn to use:</p>

<ul>
  <li>the built-in <strong>Authentication Generator</strong> to create an admin system for managing products.</li>
  <li>Action Mailer, Active Job, and <strong>Solid Queue</strong> to run background jobs that send email notifications to subscribers when products are back in stock.</li>
  <li><strong>Solid Cache</strong> to cache product information and improve performance.</li>
  <li><strong>Kamal 2.0</strong> to deploy your app to production.</li>
</ul>

<p>This tutorial is beginner-friendly yet comprehensive, designed to make Rails accessible to everyone and welcome beginners to Rails for years to come. It’s also expandable, paving the way for future tutorials adding more features to the app.</p>

<p><strong><a href="https://guides.rubyonrails.org/getting_started.html" style="text-align: center;">Follow the Getting Started Tutorial here.</a></strong></p>

<p><strong>Note</strong>: The <a href="https://guides.rubyonrails.org/install_ruby_on_rails.html">Installation Guide</a> is now separate from the Getting Started Guide, making it easier to find.</p>

<p>Special thanks to <strong>Chris Oliver</strong> of <a href="https://gorails.com/">GoRails</a> for writing this tutorial, with help from Rafael França, Xavier Noria, Jeremy Daer, Matthew Draper, Collin Jilbert, Kent Crutchfield, Harriet Oughton, Julian Duss, Santiago Rodriguez, Gianlo Occhipinti, Kim Perino, and all the reviewers on GitHub.</p>

<p><strong>Rails 8 Unpacked with Typecraft</strong></p>

<p><strong>Rails 8 Unpacked with Typecraft</strong> is a 9-part video series exploring Rails 8’s default features through the lens of adding features to a task management demo app.</p>

<p>You’ll learn:</p>
<ul>
  <li>Authentication with the new <strong>Authentication Generator</strong>.</li>
  <li>Asset management using <strong>Propshaft</strong>.</li>
  <li>The <strong>Solid Trifecta</strong> for caching, messaging, and job queueing.</li>
  <li>Deployment with <strong>Kamal 2.0</strong>.</li>
</ul>

<p>You can build your own app or follow along with the demo app by checking out the branches of the GitHub repo found under each episode.</p>

<p><strong><a href="https://youtube.com/playlist?list=PLHFP2OPUpCebdA4-xR07SPpoBWVERkHR6&amp;si=eLKZPHYYHtaQotKr">Watch Rails 8 Unpacked on the Rails YouTube channel.</a></strong></p>

<p>Thanks to <strong>Chris Power</strong> and <strong>Robert Beene</strong> from <a href="https://typecraft.dev/">Typecraft</a>, and reviewers Rosa Gutierrez, Donal McBreen, Breno Gazzola, Miles Woodroffe, Bruno Miranda, and the Rails Core team.</p>

<p><strong>Also</strong>: This series is subtitled in Japanese, Brazilian Portuguese, and Spanish thanks to the team at  <a href="happyscribe.com">Happy Scribe</a>!</p>

<p><strong>Updated Rails Guides</strong></p>

<p>And finally, the Rails Guides have also been updated with the new defaults. You’ll now find:</p>

<ul>
  <li>The <strong>Authentication Generator</strong> in the <a href="https://guides.rubyonrails.org/security.html">Security Guide</a></li>
  <li><strong>Propshaft</strong> as the default in the <a href="https://guides.rubyonrails.org/asset_pipeline.html">Asset Pipeline Guide</a></li>
  <li><strong>Solid Cache</strong> in the <a href="https://guides.rubyonrails.org/caching_with_rails.html">Caching Guide</a></li>
  <li><strong>Solid Queue</strong> in the <a href="https://guides.rubyonrails.org/active_job_basics.html">Active Job Basics Guide</a></li>
</ul>

<p>More updates are on the way! Thanks to the docs team - <strong>Ridhwana Khan</strong>, <strong>Bhumi Shah</strong>, <strong>Harriet Oughton</strong>, <strong>Petrik de Heus</strong> - and everyone in the community who reviewed their PRs.
**</p>

<p>Whether you’re a new or experienced Rails developer, we hope you’ll find these resources helpful when exploring all that Rails 8 has to offer.</p>

<p>If you have other suggestions on how we can support you, our <a href="https://app.todohelpers.com/forms/4758b5b0-d6f9-4f41-8041-992cc9b748fb">suggestion box</a> is always open.</p>

<p>Have fun building with Rails 8!</p>]]></content><author><name>Amanda Perino</name></author><category term="news," /><category term="foundation" /><summary type="html"><![CDATA[Rails 8 is a major milestone, and for the first time in Rails’ history, thanks to the support of the members of the Rails Foundation, we are able to support this major release with new and updated tutorials, videos, and guides to help developers learn Rails’ new default features as quickly as possible.]]></summary></entry><entry><title type="html">Introducing the first Rails case study: Doximity’s Journey with Rails</title><link href="https://rubyonrails.org/2024/12/12/introducing-doximity-case-study" rel="alternate" type="text/html" title="Introducing the first Rails case study: Doximity’s Journey with Rails" /><published>2024-12-12T00:00:00+00:00</published><updated>2024-12-12T00:00:00+00:00</updated><id>https://rubyonrails.org/2024/12/12/introducing-doximity-case-study</id><content type="html" xml:base="https://rubyonrails.org/2024/12/12/introducing-doximity-case-study"><![CDATA[<p>Today, the Rails Foundation is releasing the first of many case studies that will showcase how companies use and build with Rails. To kick off this series, we’re highlighting the story of why <a href="https://www.doximity.com/">Doximity</a> chose Rails in 2010, and how they’ve been building and scaling their original monolith successfully for the past 15 years.</p>

<p>Doximity is the leading digital platform for U.S. medical professionals. Their mission is to help doctors provide better care to their patients by providing tools that help streamline communication, collaboration, and clinical workflow, including telehealth. Over the past 15 years, they’ve grown to serve more than two million healthcare professionals, including more than 80% of U.S. doctors.</p>

<p>In this case study, you’ll read how they used Rails to move fast, iterate quickly in response to customer feedback, and evolve their monolith, all while navigating the additional challenges of scaling a critical platform quickly during a global pandemic.</p>

<p><strong>Read the case study: <a href="https://rubyonrails.org/docs/case-studies/doximity">Fast, Flexible, and Scalable: How Rails Powers Doximity’s Healthcare Platform</a></strong></p>

<p><img src="/assets/images/case-study-doximity-app.png" /></p>

<p><em>Big thanks to Doximity’s engineering leadership who took an active part in sharing their story, and a big shout out to Robby Russell and his team at Planet Argon for getting this first case study written and shipped.</em></p>

<p><strong>Why we’re sharing these stories</strong></p>

<p>If you’re a seasoned Rails developer, you’re probably not the primary audience for these stories - you already know the joy and power of Rails. You work with it every day!</p>

<p>But the Rails Foundation exists to show the world that Rails is an excellent choice for building fast, flexible, and scalable applications. And what better way to do that than by telling the stories of companies like Doximity, who have done exactly that? Case studies like these offer real-world examples of how Rails empowers even small teams to deliver big results so businesses can focus on what matters: growing the business, meeting customer needs, adding new features.</p>

<p>So these stories are for those outside our community: entrepreneurs, engineers from other languages, technical decision-makers, and potential founders who might not yet see what Rails can offer. We want to show them the speed and agility Rails brings to startups, the scalability that powers platforms like Doximity (and so many others), and the ability to grow your idea with confidence “from Hello World to IPO” on a solid foundation that’s been thriving for over 20 years.</p>

<p>With Rails, the possibilities are endless, and we have a lot of stories to tell. And maybe, just maybe, these stories will inspire others with a vision, or a dream, or a new idea for the next big thing.</p>

<p>Stay tuned. More case studies coming next year.</p>]]></content><author><name>Amanda Perino</name></author><category term="news," /><category term="foundation" /><summary type="html"><![CDATA[Today, the Rails Foundation is releasing the first of many case studies that will showcase how companies use and build with Rails. To kick off this series, we’re highlighting the story of why Doximity chose Rails in 2010, and how they’ve been building and scaling their original monolith successfully for the past 15 years.]]></summary></entry></feed>