<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Prakash Sanyasi</title>
    <description>The latest articles on DEV Community by Prakash Sanyasi (@psruby).</description>
    <link>https://dev.to/psruby</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F854444%2Fa1e27770-2c40-41d0-89b5-ec550fcdabdf.jpeg</url>
      <title>DEV Community: Prakash Sanyasi</title>
      <link>https://dev.to/psruby</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/psruby"/>
    <language>en</language>
    <item>
      <title>Rails 8: New Features and Enhancements for Modern Web Development</title>
      <dc:creator>Prakash Sanyasi</dc:creator>
      <pubDate>Fri, 23 May 2025 12:04:00 +0000</pubDate>
      <link>https://dev.to/psruby/rails-8-new-features-and-enhancements-for-modern-web-development-38op</link>
      <guid>https://dev.to/psruby/rails-8-new-features-and-enhancements-for-modern-web-development-38op</guid>
      <description>&lt;p&gt;Ruby on Rails 8 has arrived, bringing exciting new features, performance improvements, and developer-friendly enhancements. Whether you're upgrading from Rails 7 or starting a new project, Rails 8 continues to streamline web development with its convention-over-configuration philosophy while embracing modern best practices.&lt;/p&gt;

&lt;p&gt;In this blog post, we'll explore the key features of Rails 8 with practical examples to help you get the most out of this release.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Turbo as the Default Frontend Solution
&lt;/h2&gt;

&lt;p&gt;Rails 8 fully embraces Hotwire (Turbo + Stimulus) as the default frontend approach, reducing JavaScript complexity while maintaining dynamic interactivity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example: Real-Time Updates with Turbo Streams&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;!--&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;views&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;posts&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;html&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;erb&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;  
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= turbo_stream_from "posts" %&amp;gt;  

&amp;lt;div id=&lt;/span&gt;&lt;span class="s2"&gt;"posts"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;  
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= render @posts %&amp;gt;  
&amp;lt;/div&amp;gt;  

&amp;lt;!-- app/views/posts/_post.html.erb --&amp;gt;  
&amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;turbo_frame_tag&lt;/span&gt; &lt;span class="n"&gt;dom_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="sx"&gt;%&amp;gt;  
  &amp;lt;h2&amp;gt;&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= post.title %&amp;gt;&amp;lt;/h2&amp;gt;  
  &amp;lt;p&amp;gt;&amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;body&lt;/span&gt; &lt;span class="sx"&gt;%&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;  
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;% end &lt;/span&gt;&lt;span class="o"&gt;%&amp;gt;&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, any changes to posts (via CRUD operations) automatically update the DOM without full-page reloads.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Improved ActiveRecord Async Queries
&lt;/h2&gt;

&lt;p&gt;Rails 8 enhances asynchronous query handling, making it easier to optimize database performance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example: Automatic Async Loading&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Rails 7 (explicit async)  &lt;/span&gt;
&lt;span class="n"&gt;posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;published: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;load_async&lt;/span&gt;  

&lt;span class="c1"&gt;# Rails 8 (implicit async when possible)  &lt;/span&gt;
&lt;span class="n"&gt;posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;published: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Automatically async under the hood  &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This reduces boilerplate and improves scalability for I/O-bound applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Better Multi-Database Support
&lt;/h2&gt;

&lt;p&gt;Rails 8 refines multi-database configurations, making it easier to scale reads and writes across different databases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example: Automatic Read Replicas&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# config/database.yml  &lt;/span&gt;
&lt;span class="ss"&gt;production:  
  primary:  
    database: &lt;/span&gt;&lt;span class="n"&gt;app_prod&lt;/span&gt;  
    &lt;span class="ss"&gt;replica:  
      database: &lt;/span&gt;&lt;span class="n"&gt;app_prod_replica&lt;/span&gt;  
      &lt;span class="ss"&gt;replica: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;  

&lt;span class="c1"&gt;# Models automatically use replicas for reads  &lt;/span&gt;
&lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt; &lt;span class="c1"&gt;# Uses replica if available  &lt;/span&gt;
&lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;name: &lt;/span&gt;&lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Uses primary DB  &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Enhanced Security with ActiveRecord Encryption
&lt;/h2&gt;

&lt;p&gt;Rails 8 expands on deterministic and non-deterministic encryption for better security while maintaining queryability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example: Encrypted Attributes&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationRecord&lt;/span&gt;  
  &lt;span class="n"&gt;encrypts&lt;/span&gt; &lt;span class="ss"&gt;:email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;deterministic: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt; &lt;span class="c1"&gt;# Allows searching  &lt;/span&gt;
  &lt;span class="n"&gt;encrypts&lt;/span&gt; &lt;span class="ss"&gt;:ssn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;deterministic: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt; &lt;span class="c1"&gt;# Fully randomized  &lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;  

&lt;span class="c1"&gt;# Querying still works for deterministic fields  &lt;/span&gt;
&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_by&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;email: &lt;/span&gt;&lt;span class="s2"&gt;"user@example.com"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Simpler Background Jobs with Solid Queue
&lt;/h2&gt;

&lt;p&gt;Rails 8 introduces Solid Queue, a new built-in database-backed job queue, as an alternative to Active Job adapters like Sidekiq.&lt;/p&gt;

&lt;p&gt;Example: Enqueuing Jobs&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# config/application.rb  &lt;/span&gt;
&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;active_job&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;queue_adapter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ss"&gt;:solid_queue&lt;/span&gt;  

&lt;span class="c1"&gt;# Enqueue a job  &lt;/span&gt;
&lt;span class="no"&gt;UserReportJob&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;perform_later&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;user_id: &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No need for Redis—just PostgreSQL or MySQL!&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Improved Error Pages &amp;amp; Debugging
&lt;/h2&gt;

&lt;p&gt;Rails 8 introduces better error pages with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enhanced stack traces&lt;/li&gt;
&lt;li&gt;Code suggestions&lt;/li&gt;
&lt;li&gt;Integrated documentation links&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No more guessing—just faster debugging!&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Built-In Health Checks
&lt;/h2&gt;

&lt;p&gt;Rails 8 adds standardized health check endpoints for monitoring and Kubernetes readiness.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example: Adding a Health Route&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# config/routes.rb  &lt;/span&gt;
&lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;routes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;draw&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;  
  &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="s2"&gt;"/up"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;to: &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"OK"&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;  
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  8. Modern Asset Management with Import Maps by Default
&lt;/h2&gt;

&lt;p&gt;Rails 8 continues promoting import maps for JavaScript dependency management without bundlers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example: Adding a JS Library&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# config/importmap.rb  &lt;/span&gt;
&lt;span class="n"&gt;pin&lt;/span&gt; &lt;span class="s2"&gt;"lodash"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;to: &lt;/span&gt;&lt;span class="s2"&gt;"https://ga.jspm.io/npm:lodash@4.17.21/lodash.js"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No Webpack or Node.js required!&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Improved Mailer Previews &amp;amp; Testing
&lt;/h2&gt;

&lt;p&gt;Mailer previews now support better organization and dynamic data.&lt;/p&gt;

&lt;p&gt;Example: Dynamic Mailer Previews&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# test/mailers/previews/user_mailer_preview.rb  &lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserMailerPreview&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ActionMailer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Preview&lt;/span&gt;  
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;welcome_email&lt;/span&gt;  
    &lt;span class="no"&gt;UserMailer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;user: &lt;/span&gt;&lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;name: &lt;/span&gt;&lt;span class="s2"&gt;"Test"&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;welcome_email&lt;/span&gt;  
  &lt;span class="k"&gt;end&lt;/span&gt;  
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;10. Faster Development with Zeitwerk Autoloader Optimizations&lt;/strong&gt;&lt;br&gt;
Rails 8 further optimizes Zeitwerk, reducing reload times in development.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Upgrading to Rails 8&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
To upgrade:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Update your Gemfile:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;"rails"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"~&amp;gt; 8.0.0"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt; Run:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bundle update rails  
rails app:update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Rails 8 continues to refine the developer experience with:&lt;br&gt;
✅ Turbo-first frontends (less JavaScript)&lt;br&gt;
✅ Better async &amp;amp; database scaling&lt;br&gt;
✅ Stronger security &amp;amp; encryption&lt;br&gt;
✅ Simpler background jobs (Solid Queue)&lt;br&gt;
✅ Improved debugging &amp;amp; monitoring&lt;/p&gt;

&lt;p&gt;Whether building a new app or upgrading, Rails 8 keeps Ruby on Rails &lt;strong&gt;fast&lt;/strong&gt;, &lt;strong&gt;secure&lt;/strong&gt;, and &lt;strong&gt;productive&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;What’s your favorite Rails 8 feature? Let me know in the comments! 🚀&lt;/p&gt;

</description>
      <category>rails</category>
      <category>rails8</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
