<?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: Rostyslav Semanyshyn</title>
    <description>The latest articles on DEV Community by Rostyslav Semanyshyn (@tetiross).</description>
    <link>https://dev.to/tetiross</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%2F119412%2Fe4c25026-79f6-494b-a0a3-a62126b2ec39.jpg</url>
      <title>DEV Community: Rostyslav Semanyshyn</title>
      <link>https://dev.to/tetiross</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tetiross"/>
    <language>en</language>
    <item>
      <title>React on Rails in 2019?</title>
      <dc:creator>Rostyslav Semanyshyn</dc:creator>
      <pubDate>Sun, 03 Feb 2019 16:37:19 +0000</pubDate>
      <link>https://dev.to/tetiross/react-on-rails-in-2019-4jn2</link>
      <guid>https://dev.to/tetiross/react-on-rails-in-2019-4jn2</guid>
      <description>&lt;p&gt;Do you use &lt;a href="https://reactjs.org"&gt;React&lt;/a&gt; in combination with &lt;a href="https://rubyonrails.org"&gt;Rails&lt;/a&gt; in production apps? Does it fit? What is the best way to combine them (gems vs separate backend &amp;amp; frontend apps)?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cover image by &lt;a href="https://unsplash.com/@austinsmart"&gt;Austin Smart&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/vPe0ltATD2k"&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>Respecting Rails app time zone in cron jobs</title>
      <dc:creator>Rostyslav Semanyshyn</dc:creator>
      <pubDate>Sat, 26 Jan 2019 13:22:04 +0000</pubDate>
      <link>https://dev.to/tetiross/respect-rails-app-time-zone-in-cron-jobs-14p7</link>
      <guid>https://dev.to/tetiross/respect-rails-app-time-zone-in-cron-jobs-14p7</guid>
      <description>&lt;p&gt;Let's imagine that you need to set default time zone in your Rails app. You go to &lt;code&gt;application.rb&lt;/code&gt; and write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;config.time_zone = 'Central Time (US &amp;amp; Canada)'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As simple as that. Now your app will take into account this info when you will perform some actions based on time.&lt;/p&gt;

&lt;p&gt;Now, let's say, you need to add some recurring jobs. Most probably you will use &lt;a href="https://github.com/javan/whenever"&gt;&lt;code&gt;whenever&lt;/code&gt;&lt;/a&gt; gem and will have this kind of code in gem generated &lt;code&gt;schedule.rb&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="n"&gt;every&lt;/span&gt; &lt;span class="ss"&gt;:monday&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;at: &lt;/span&gt;&lt;span class="s1"&gt;'9am'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;rake&lt;/span&gt; &lt;span class="s1"&gt;'send_weekly_reports'&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What this code will do? It will run &lt;code&gt;send_weekly_reports&lt;/code&gt; rake task each Monday at 9am. But. 9am at what time zone? Maybe time zone that we previously set as our app default time zone? No. It will use server time zone.&lt;/p&gt;

&lt;p&gt;But what if you want to use your app time zone? We have 2 options here:&lt;br&gt;
a) we can change our server time zone to the same time zone as we use in our app;&lt;br&gt;
b) we can handle it inside our app.&lt;/p&gt;

&lt;p&gt;Let's see how you can handle it inside the app.&lt;/p&gt;

&lt;p&gt;You will need to add this code to your &lt;code&gt;schedule.rb&lt;/code&gt; file:&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="nb"&gt;require_relative&lt;/span&gt; &lt;span class="s1"&gt;'./environment'&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;timezoned&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
  &lt;span class="no"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;zone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;utc&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;every&lt;/span&gt; &lt;span class="ss"&gt;:monday&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;at: &lt;/span&gt;&lt;span class="n"&gt;timezoned&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'9am'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;rake&lt;/span&gt; &lt;span class="s1"&gt;'send_weekly_reports'&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you will need to use method &lt;code&gt;timezoned&lt;/code&gt; by passing required time to it and get your time parsed to UTC which is mostly used by servers.&lt;br&gt;
&lt;code&gt;require_relative './environment'&lt;/code&gt; is here to be able to call &lt;code&gt;timezoned&lt;/code&gt; method code.&lt;/p&gt;

&lt;p&gt;As a result, now if we are setting some job to be run at 9am, it will run at 9am at the time zone defined by you at &lt;code&gt;application.rb&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cover image by &lt;a href="https://unsplash.com/@stanleydai"&gt;Stanley Dai&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/SEB_I5Cl_sw"&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
      <category>cron</category>
      <category>whenever</category>
    </item>
    <item>
      <title>exception_notification: Slack mentions</title>
      <dc:creator>Rostyslav Semanyshyn</dc:creator>
      <pubDate>Sun, 20 Jan 2019 20:43:15 +0000</pubDate>
      <link>https://dev.to/tetiross/exceptionnotification-slack-mentions-5e06</link>
      <guid>https://dev.to/tetiross/exceptionnotification-slack-mentions-5e06</guid>
      <description>&lt;p&gt;Have you ever tried &lt;a href="https://github.com/smartinez87/exception_notification"&gt;&lt;code&gt;exception_notification&lt;/code&gt; gem&lt;/a&gt;? It can help you to catch errors in your rails &lt;em&gt;(not only)&lt;/em&gt; app and send them to you via email, Slack or other supported notification methods. &lt;/p&gt;

&lt;p&gt;The problem I encountered is that if you use &lt;a href="https://github.com/smartinez87/exception_notification/blob/master/docs/notifiers/slack.md"&gt;Slack as notifier&lt;/a&gt;, it will send a message to channel silently, without any mentions. Well, it is not a problem if you have Slack notifications set up to send you notification on each message. But if you receive notifications only for mentioned messages, you can potentially loose some time before seeing this message, which is not very good.&lt;/p&gt;

&lt;p&gt;In this article I will show you how you can add mentions to Slack messages that are generated by &lt;code&gt;exception_notification&lt;/code&gt; gem. &lt;/p&gt;

&lt;p&gt;So, first let's look how basic config looks like if you want to use Slack as messages receiver.&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="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;configure&lt;/span&gt; &lt;span class="k"&gt;do&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;middleware&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt; &lt;span class="no"&gt;ExceptionNotification&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Rack&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="ss"&gt;slack: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="ss"&gt;webhook_url: &lt;/span&gt;&lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'SLACK_WEBHOOK_URL'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="ss"&gt;channel:     &lt;/span&gt;&lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'SLACK_CHANNEL_NAME'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="ss"&gt;additional_parameters: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="ss"&gt;mrkdwn: &lt;/span&gt;&lt;span class="kp"&gt;true&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;p&gt;And how generated message looks like in Slack.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DDwkFm5G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/7ji1o7q2e8yu3ub8hy37.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DDwkFm5G--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/7ji1o7q2e8yu3ub8hy37.png" alt="exception_notification slack notifier"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can see that message consists of several parts. First is the main text, and then a number of fields like &lt;strong&gt;Exception&lt;/strong&gt;, &lt;strong&gt;Hostname&lt;/strong&gt; and &lt;strong&gt;Backtrace&lt;/strong&gt;. All those fields are automatically generated by &lt;code&gt;exception_notification&lt;/code&gt;, but you can add your own custom fields too.&lt;/p&gt;

&lt;p&gt;In our config file, besides &lt;code&gt;webhook_url&lt;/code&gt;, &lt;code&gt;channel&lt;/code&gt;, and &lt;code&gt;additional_parameters&lt;/code&gt;, you can also add &lt;code&gt;additional_fields&lt;/code&gt; option, which will accept array of hashes with &lt;code&gt;title&lt;/code&gt; and &lt;code&gt;value&lt;/code&gt; keys. That option is responsible for adding more &lt;strong&gt;Backtrace&lt;/strong&gt; like fields to Slack message. &lt;/p&gt;

&lt;p&gt;So, we can add field with &lt;code&gt;title&lt;/code&gt;: &lt;code&gt;Mentions&lt;/code&gt; and &lt;code&gt;value&lt;/code&gt;: &lt;code&gt;&amp;lt;!channel&amp;gt;&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="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;configure&lt;/span&gt; &lt;span class="k"&gt;do&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;middleware&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt; &lt;span class="no"&gt;ExceptionNotification&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Rack&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="ss"&gt;slack: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="ss"&gt;webhook_url: &lt;/span&gt;&lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'SLACK_WEBHOOK_URL'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="ss"&gt;channel:     &lt;/span&gt;&lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'SLACK_CHANNEL_NAME'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="ss"&gt;additional_parameters: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="ss"&gt;mrkdwn: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="ss"&gt;additional_fields: &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;title: &lt;/span&gt;&lt;span class="s1"&gt;'Mentions'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;value: &lt;/span&gt;&lt;span class="s1"&gt;'&amp;lt;!channel&amp;gt;'&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="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that will add one more field to our Slack message which will raise &lt;code&gt;@channel&lt;/code&gt; mention and all users in this channel will receive notification. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--D0PJXA9F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/mcb5m9vvcif2gkxz7bp1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--D0PJXA9F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/mcb5m9vvcif2gkxz7bp1.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the &lt;code&gt;value&lt;/code&gt; field we wrote &lt;code&gt;&amp;lt;!channel&amp;gt;&lt;/code&gt;, no just &lt;code&gt;@channel&lt;/code&gt;, because Slack uses &lt;a href="https://api.slack.com/docs/message-formatting#linking_to_channels_and_users"&gt;special message formatting&lt;/a&gt;. If you want to mention some user, for example, you will need to write it like this: &lt;code&gt;&amp;lt;@username&amp;gt;&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
    </item>
  </channel>
</rss>
