<?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.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>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>
