<?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: Fabio Bazurto Blacio</title>
    <description>The latest articles on DEV Community by Fabio Bazurto Blacio (@fabiobazurtobla).</description>
    <link>https://dev.to/fabiobazurtobla</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F403020%2F2162ca3f-ed63-4cc6-862c-5e37173661ec.jpg</url>
      <title>DEV Community: Fabio Bazurto Blacio</title>
      <link>https://dev.to/fabiobazurtobla</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fabiobazurtobla"/>
    <language>en</language>
    <item>
      <title>Pagination: Always a "sort" (of) mistake [bugfix]</title>
      <dc:creator>Fabio Bazurto Blacio</dc:creator>
      <pubDate>Mon, 22 Jun 2026 03:13:39 +0000</pubDate>
      <link>https://dev.to/fabiobazurtobla/pagination-always-a-sort-of-mistake-bugfix-3m59</link>
      <guid>https://dev.to/fabiobazurtobla/pagination-always-a-sort-of-mistake-bugfix-3m59</guid>
      <description>&lt;p&gt;Pagination is a key component on web-applications that let users navigate through pages making easy to read/find records. Also, pagination is a great strategy to improve performance by avoiding to load entire dataset at once. However, while working with Kaminari, a popular pagination gem in Rails, I encountered an unexpected issue that revealed an interesting edge case.&lt;/p&gt;

&lt;h3&gt;
  
  
  Identify the issue
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Rails 7.1&lt;/li&gt;
&lt;li&gt;Ruby 3.2.x&lt;/li&gt;
&lt;li&gt;Kaminari gem 1.2&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Basically, pagination in frontend was not working properly. Datatable should load 316 total rows, although when the user started to load 15 records per page, frontend is showing inaccurate total rows. Multiple of 15 should ends at 0 or 5. There were pages with 64 records, crazy world. Some pages were loading 12 or 11 rows. There is no issues or error messages in the frontend or backend.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lost in debugging-land
&lt;/h3&gt;

&lt;p&gt;After discarding Angular frontend errors, I started to dig into backend controller and Kaminari configuration. Nothing seems wrong. Everything looked good: test suite, smoke tests, desktop debugging. Despite of test results, I started to wonder: what if returned-data is wrong after all?&lt;/p&gt;

&lt;p&gt;and... Bingo!&lt;/p&gt;

&lt;p&gt;Finally, after checking every response I noticed that there were duped records in two different pages(pagination requests). Those duped records were skipped from Angular data-table and that's why loaded/total rows did not match.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bingo: a sort of mistake
&lt;/h3&gt;

&lt;p&gt;This tricky bug has a simple explanation: bad sorting.&lt;/p&gt;

&lt;p&gt;Kaminari uses a SQL query using LIMIT/OFFSET strategy:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SELECT * FROM posts ORDER BY id LIMIT 25 OFFSET 0&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ORDER BY&lt;/strong&gt;: sort the collection.&lt;br&gt;
&lt;strong&gt;LIMIT&lt;/strong&gt;: number of records per page.&lt;br&gt;
&lt;strong&gt;OFFSET&lt;/strong&gt;: is used to skip a specified number of rows before starting to return rows from a query.&lt;/p&gt;

&lt;p&gt;This works perfectly using &lt;code&gt;ORDER BY id&lt;/code&gt; because primary key is unique. Check table A.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;title&lt;/th&gt;
&lt;th&gt;body&lt;/th&gt;
&lt;th&gt;created_at&lt;/th&gt;
&lt;th&gt;lock&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;td&gt;Welcome to the Platform&lt;/td&gt;
&lt;td&gt;First post introducing the new platform features.&lt;/td&gt;
&lt;td&gt;2026-06-16 08:15:22&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;102&lt;/td&gt;
&lt;td&gt;Summer Update&lt;/td&gt;
&lt;td&gt;Announcing the latest improvements and updates.&lt;/td&gt;
&lt;td&gt;2026-06-16 08:15:22&lt;/td&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;103&lt;/td&gt;
&lt;td&gt;Community Guidelines&lt;/td&gt;
&lt;td&gt;Please review the rules and guidelines for posting.&lt;/td&gt;
&lt;td&gt;2026-06-16 08:15:22&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;104&lt;/td&gt;
&lt;td&gt;New Project Launch&lt;/td&gt;
&lt;td&gt;Details about the upcoming project release.&lt;/td&gt;
&lt;td&gt;2026-06-16 08:15:22&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;105&lt;/td&gt;
&lt;td&gt;Maintenance Notice&lt;/td&gt;
&lt;td&gt;Scheduled maintenance will happen this weekend.&lt;/td&gt;
&lt;td&gt;2026-06-16 08:15:22&lt;/td&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;table A - Posts table with same created_at value.&lt;/p&gt;

&lt;p&gt;But when you use a column like &lt;code&gt;created_at&lt;/code&gt;, with exactly same value, you let MySQL choose what records returns in a relative page. It only guarantees that all five rows appear together relative to other timestamps. It does not guarantee whether they appear as:&lt;/p&gt;

&lt;p&gt;101,102,103,104,105&lt;/p&gt;

&lt;p&gt;or&lt;/p&gt;

&lt;p&gt;103,105,101,104,102&lt;/p&gt;

&lt;p&gt;or any other order.&lt;/p&gt;

&lt;p&gt;As a result:&lt;/p&gt;

&lt;p&gt;Page 1 might end with rows 101,102,103&lt;br&gt;
Page 2 might start with 103,104,105&lt;/p&gt;

&lt;p&gt;because &lt;strong&gt;MySQL&lt;/strong&gt; reordered the tied rows between executions.&lt;/p&gt;

&lt;p&gt;Given &lt;code&gt;created_at&lt;/code&gt; had exactly same values, I just added a secondary sort with a unique value &lt;code&gt;id&lt;/code&gt;. You could use any other column to assign an unique position in the sorting, just check your indexes and choose a good column.&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="vi"&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;order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;created_at: :desc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;id: :desc&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;page&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:page&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;per&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Pagination is an important tool for finding records—it keeps your listings fast and your users happy by avoiding that painful full-table load. So take care of your data structures and plan your sorting thoughtfully. &lt;strong&gt;Kaminari&lt;/strong&gt; does what you configure, so make sure you're giving it the right instructions. Care for your dataset, plan what you show, and your users will be happy with your listing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bibliography
&lt;/h3&gt;

&lt;p&gt;Stroz, S. (2025, October 14). MySQL basics: Turning the page—Using LIMIT and OFFSET for pagination. The Oracle MySQL Blog. Retrieved June 11, 2026, from &lt;a href="https://blogs.oracle.com/mysql/mysql-basics-pagination" rel="noopener noreferrer"&gt;https://blogs.oracle.com/mysql/mysql-basics-pagination&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dhandala, N. (2025, July 2). How to Implement Pagination with Kaminari in Rails. OneUptime | One Complete Observability Platform. &lt;a href="https://oneuptime.com/blog/post/2025-07-02-rails-kaminari-pagination/view" rel="noopener noreferrer"&gt;https://oneuptime.com/blog/post/2025-07-02-rails-kaminari-pagination/view&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mysql</category>
      <category>rails</category>
      <category>software</category>
    </item>
    <item>
      <title>The two returning values in Action Mailer [bugfix]</title>
      <dc:creator>Fabio Bazurto Blacio</dc:creator>
      <pubDate>Mon, 09 Feb 2026 05:04:34 +0000</pubDate>
      <link>https://dev.to/fabiobazurtobla/the-two-returning-values-in-action-mailer-bugfix-2lkh</link>
      <guid>https://dev.to/fabiobazurtobla/the-two-returning-values-in-action-mailer-bugfix-2lkh</guid>
      <description>&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Rails 7.1&lt;/li&gt;
&lt;li&gt;Ruby 3.x&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your production environment is sending emails using Action Mailer and smtp delivery method. You implemented a very common pattern using Action:&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;NotificationMailer&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationMailer&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;processed_success&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pass_custom_condition?&lt;/span&gt;
      &lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;to: &lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;subject: &lt;/span&gt;&lt;span class="s1"&gt;'Record processed'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&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;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Record processed but notification is not delivered'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;end&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;Inside the Mailer, there is a condition that will return two possible values: a fully configured mail object and automatically is returned a nullable object &lt;code&gt;ActionMailer::Base::MailNull&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Iteration
&lt;/h2&gt;

&lt;p&gt;An iteration that implements dynamic delivery settings.[1]&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;NotificationMailer&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationMailer&lt;/span&gt;
  &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;Customizable&lt;/span&gt; &lt;span class="c1"&gt;# concern to apply changes from db &lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;processed_success&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pass_custom_condition?&lt;/span&gt;
      &lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;to: &lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;subject: &lt;/span&gt;&lt;span class="s1"&gt;'Record processed'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&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;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Record processed but notification is not delivered'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;end&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;Concern&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;module&lt;/span&gt; &lt;span class="nn"&gt;Customizable&lt;/span&gt;
  &lt;span class="kp"&gt;extend&lt;/span&gt; &lt;span class="no"&gt;ActiveSupport&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Concern&lt;/span&gt;

  &lt;span class="n"&gt;included&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="c1"&gt;# include callback into the mailers&lt;/span&gt;
    &lt;span class="n"&gt;after_action&lt;/span&gt; &lt;span class="ss"&gt;:overrides_mail_settings&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;if: &lt;/span&gt;&lt;span class="n"&gt;has_overrides_enabled?&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;overrides_mail_settings&lt;/span&gt;
    &lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;delivery_method&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;merge!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@business&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;smtp_settings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;has_overrides_enabled?&lt;/span&gt;
    &lt;span class="vi"&gt;@business&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;customize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;present?&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;h2&gt;
  
  
  The Bug
&lt;/h2&gt;

&lt;p&gt;Following the suggested implementation in the rails documentation and the backward common pattern, you should receive this error when you try to deliver &lt;code&gt;NotificationMailer#deliver_now&lt;/code&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="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;ArgumentError&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="no"&gt;SMTP&lt;/span&gt; &lt;span class="no"&gt;To&lt;/span&gt; &lt;span class="n"&gt;address&lt;/span&gt; &lt;span class="n"&gt;may&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="ss"&gt;blank: &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Before the callback change, the mailing process finishes with a return value: &lt;code&gt;Mail::Message&lt;/code&gt; or &lt;code&gt;ActionMailer::Base::MailNull&lt;/code&gt;. &lt;/li&gt;
&lt;li&gt;After adding the callback, the mailer lifecycle expands with a message object copying default values into it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;p&gt;Our goal is ensuring backward compatibility by returning: &lt;code&gt;Mail::Message&lt;/code&gt; or &lt;code&gt;ActionMailer::Base::MailNull&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Concern&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;module&lt;/span&gt; &lt;span class="nn"&gt;Customizable&lt;/span&gt;
  &lt;span class="kp"&gt;extend&lt;/span&gt; &lt;span class="no"&gt;ActiveSupport&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Concern&lt;/span&gt;

  &lt;span class="n"&gt;included&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="c1"&gt;# include callback into the mailers&lt;/span&gt;
    &lt;span class="n"&gt;after_action&lt;/span&gt; &lt;span class="ss"&gt;:overrides_mail_settings&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;if: &lt;/span&gt;&lt;span class="n"&gt;overrides_allowed?&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;overrides_mail_settings&lt;/span&gt;
    &lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;delivery_method&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;merge!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@business&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;smtp_settings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;overrides_allowed?&lt;/span&gt;
    &lt;span class="vi"&gt;@business&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;customize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;present?&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;present?&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;h2&gt;
  
  
  Final Words
&lt;/h2&gt;

&lt;p&gt;Although this fixes our problem and ensures backward compatibility, I would rather move business validation out of the mailer. In my opinion, a mailer class is in the presentation layer responsible for configuring delivery details, customizing layouts and showing content. Any business rule should be in a different component like a service or job.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bibliography
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Action Mailer Basics — Ruby on Rails Guides. (2024). Ruby on Rails Guides. &lt;a href="https://guides.rubyonrails.org/action_mailer_basics.html" rel="noopener noreferrer"&gt;https://guides.rubyonrails.org/action_mailer_basics.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Rails Api. (2025). rails/actionmailer/lib/action_mailer/base.rb at main · rails/rails. GitHub. &lt;a href="https://github.com/rails/rails/blob/main/actionmailer/lib/action_mailer/base.rb" rel="noopener noreferrer"&gt;https://github.com/rails/rails/blob/main/actionmailer/lib/action_mailer/base.rb&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;‌&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Bug: Docker-compose up?</title>
      <dc:creator>Fabio Bazurto Blacio</dc:creator>
      <pubDate>Tue, 04 Jun 2024 00:56:05 +0000</pubDate>
      <link>https://dev.to/fabiobazurtobla/bug-docker-compose-up-1coj</link>
      <guid>https://dev.to/fabiobazurtobla/bug-docker-compose-up-1coj</guid>
      <description>&lt;h3&gt;
  
  
  ERROR
&lt;/h3&gt;

&lt;p&gt;I've been using a bash script to do docker operations in past by using &lt;code&gt;docker-compose&lt;/code&gt;. So one day, I started to receive this error:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;**ERROR: for my_docker_container_1  'ContainerConfig'**&lt;/code&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  CAUSE
&lt;/h3&gt;

&lt;p&gt;The statement &lt;code&gt;docker-compose&lt;/code&gt; is not working anymore for recent versions of Docker Compose. This error is very common when you have updated to the latest version of Docker Compose ( I'm &lt;code&gt;2.27.0&lt;/code&gt;). Docker Compose syntax changed.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker-compose up -d my_docker_container&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  SOLUTION
&lt;/h3&gt;

&lt;p&gt;In order to start/stop containers you will need to remove "-" and run command like this.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker compose up -d my_docker_container&lt;/code&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>dockercompose</category>
      <category>bugfix</category>
    </item>
  </channel>
</rss>
