<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://undefined-reference.org/feed.xml" rel="self" type="application/atom+xml" /><link href="https://undefined-reference.org/" rel="alternate" type="text/html" /><updated>2026-06-24T07:38:31+00:00</updated><id>https://undefined-reference.org/feed.xml</id><title type="html">undefined reference</title><subtitle>ruby and friends programming blog</subtitle><author><name>Oleg Antonyan</name></author><entry><title type="html">Float division by 0 in not always Infinity</title><link href="https://undefined-reference.org/2021/11/20/zero-division.html" rel="alternate" type="text/html" title="Float division by 0 in not always Infinity" /><published>2021-11-20T07:16:28+00:00</published><updated>2021-11-20T07:16:28+00:00</updated><id>https://undefined-reference.org/2021/11/20/zero-division</id><content type="html" xml:base="https://undefined-reference.org/2021/11/20/zero-division.html"><![CDATA[<p>Turns out this is expected behavior:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="mf">1.0</span> <span class="o">/</span> <span class="mf">0.0</span>
<span class="o">=&gt;</span> <span class="no">Infinity</span>
<span class="mf">0.0</span> <span class="o">/</span> <span class="mf">0.0</span>
<span class="o">=&gt;</span> <span class="no">NaN</span>
</code></pre></div></div>

<p>Because Ruby follows IEEE 754:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>- Invalid operation: mathematically undefined, e.g., the square root of a negative number. By default, returns qNaN.
- Division by zero: an operation on finite operands gives an exact infinite result, e.g., 1/0 or log(0). By default, returns ±infinity.
</code></pre></div></div>

<h3 id="links">Links</h3>
<ul>
  <li><a href="https://en.wikipedia.org/wiki/IEEE_754">IEEE 754</a></li>
</ul>]]></content><author><name>Oleg Antonyan</name></author><category term="ruby" /><summary type="html"><![CDATA[1.0 / 0.0 #=> Infinity, but 0.0 / 0.0 #=> NaN]]></summary></entry><entry><title type="html">Why you should probably avoid mixins</title><link href="https://undefined-reference.org/2017/06/10/why-you-should-probably-avoid-mixins.html" rel="alternate" type="text/html" title="Why you should probably avoid mixins" /><published>2017-06-10T05:35:28+00:00</published><updated>2017-06-10T05:35:28+00:00</updated><id>https://undefined-reference.org/2017/06/10/why-you-should-probably-avoid-mixins</id><content type="html" xml:base="https://undefined-reference.org/2017/06/10/why-you-should-probably-avoid-mixins.html"><![CDATA[<p>As you might have heard <a href="https://softwareengineering.stackexchange.com/questions/260343/why-is-inheritance-generally-viewed-as-a-bad-thing-by-oop-proponents">inheritance is evil</a>. I won’t argue, but indeed often inheritance is used improperly. The only legitimate usage of inheritance is creating more specific entity, not sharing the code. In this blog post I’ll assume that inheritance is evil when used for code sharing.</p>

<h3 id="mixins-are-another-syntax-for-inheritance">Mixins are another syntax for inheritance</h3>

<p>TL;TD And they are used for code sharing, thus mixins are evil.
Indeed, in Ruby included module becomes an implicit superclass with all perks of inheritance. And this can be abused.</p>

<h4 id="1-super-and-method-overriding">1) super and method overriding</h4>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">module</span> <span class="nn">One</span>
  <span class="k">def</span> <span class="nf">func</span>
    <span class="nb">puts</span> <span class="s2">"in module"</span>
  <span class="k">end</span>  
<span class="k">end</span>  

<span class="k">class</span> <span class="nc">Two</span>
  <span class="kp">include</span> <span class="no">One</span>
  <span class="k">def</span> <span class="nf">func</span>
    <span class="nb">puts</span> <span class="s2">"in class"</span>
    <span class="k">super</span>
  <span class="k">end</span>  
<span class="k">end</span>

<span class="c1"># take a look at object hierarchy</span>
<span class="no">Two</span><span class="p">.</span><span class="nf">ancestors</span>
<span class="p">[</span>
    <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="no">Two</span> <span class="o">&lt;</span> <span class="no">Object</span><span class="p">,</span>
    <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="no">One</span><span class="p">,</span>                  <span class="c1"># implicit superclass</span>
    <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="no">Object</span> <span class="o">&lt;</span> <span class="no">BasicObject</span><span class="p">,</span>
    <span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="no">PP</span><span class="o">::</span><span class="no">ObjectMixin</span><span class="p">,</span>
    <span class="p">[</span><span class="mi">4</span><span class="p">]</span> <span class="no">Kernel</span><span class="p">,</span>
    <span class="p">[</span><span class="mi">5</span><span class="p">]</span> <span class="no">BasicObject</span>
<span class="p">]</span>

<span class="c1"># call a function</span>
<span class="no">Two</span><span class="p">.</span><span class="nf">new</span><span class="p">.</span><span class="nf">func</span>
<span class="k">in</span> <span class="k">class</span>
<span class="k">in</span> <span class="n">module</span>    <span class="c1"># &lt;- yes, you can call `super`</span>
</code></pre></div></div>

<p>You can also include many modules with the same methods:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">module</span> <span class="nn">One</span>
  <span class="k">def</span> <span class="nf">func</span>
    <span class="nb">puts</span> <span class="s2">"in one"</span>
  <span class="k">end</span>  
<span class="k">end</span>  

<span class="k">module</span> <span class="nn">Two</span>
  <span class="k">def</span> <span class="nf">func</span>
    <span class="nb">puts</span> <span class="s2">"in two"</span>
  <span class="k">end</span>  
<span class="k">end</span>

<span class="k">class</span> <span class="nc">Three</span>
  <span class="kp">include</span> <span class="no">One</span>
  <span class="kp">include</span> <span class="no">Two</span>
  <span class="k">def</span> <span class="nf">func</span>
    <span class="nb">puts</span> <span class="s2">"in class"</span>
    <span class="k">super</span>
  <span class="k">end</span>
<span class="k">end</span>

<span class="no">Three</span><span class="p">.</span><span class="nf">ancestors</span>
<span class="p">[</span>
    <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="no">Three</span> <span class="o">&lt;</span> <span class="no">Object</span><span class="p">,</span>
    <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="no">Two</span><span class="p">,</span>
    <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="no">One</span><span class="p">,</span>
    <span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="no">Object</span> <span class="o">&lt;</span> <span class="no">BasicObject</span><span class="p">,</span>
    <span class="p">[</span><span class="mi">4</span><span class="p">]</span> <span class="no">PP</span><span class="o">::</span><span class="no">ObjectMixin</span><span class="p">,</span>
    <span class="p">[</span><span class="mi">5</span><span class="p">]</span> <span class="no">Kernel</span><span class="p">,</span>
    <span class="p">[</span><span class="mi">6</span><span class="p">]</span> <span class="no">BasicObject</span>
<span class="p">]</span>

<span class="no">Three</span><span class="p">.</span><span class="nf">new</span><span class="p">.</span><span class="nf">func</span> <span class="c1">#=&gt; what do you expect here?</span>
</code></pre></div></div>

<p>The last example can be an interview question. It requires knowledge of how modules and inheritance actually work.</p>

<h4 id="2-they-have-access-to-instance-variables-of-a-class">2) they have access to instance variables of a class</h4>

<p>Being just a superclass, included module can access private instance variables of a child:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">module</span> <span class="nn">One</span>
  <span class="k">def</span> <span class="nf">func</span>
    <span class="nb">puts</span> <span class="vi">@var</span>
  <span class="k">end</span>  
<span class="k">end</span>  

<span class="k">class</span> <span class="nc">Two</span>
  <span class="kp">include</span> <span class="no">One</span>
  <span class="k">def</span> <span class="nf">initialize</span>
    <span class="vi">@var</span> <span class="o">=</span> <span class="s1">'hello'</span>
  <span class="k">end</span>  
<span class="k">end</span>  

<span class="no">Two</span><span class="p">.</span><span class="nf">new</span><span class="p">.</span><span class="nf">func</span> <span class="c1">#=&gt; hello</span>
</code></pre></div></div>

<p>Same is true for private methods.</p>

<h3 id="evil-begins">Evil begins</h3>

<p>Now a developer can abuse mixins and make his code an unreadable mess. With good intentions, of course. For example, why not include 10 modules in 1 class? Now I have a “small” class and everything else spread across 10 entangled modules. Did I mention that you can call methods of another module from withing a module? Multiply this possibility by method overriding and instance variables and here comes a mess.</p>

<p>Is this really bad? <a href="https://www.youtube.com/watch?v=8bZh5LMaSmE">Yes! You should keep you classes and method small</a>, but when you split a big class into modules you make things worse. Now you have not only a big class, but a big class scattered across multiple files making it harder to read.</p>

<h3 id="conclusion">Conclusion</h3>

<p>Mixins are just cheaty syntax for inheritance intended for code sharing. Avoid them if you can. Prefer composition instead. This is true for any kind of inheritance, and especially for mixins.</p>

<p>In my opinion, the only legit case for mixins is when your module has no dependency on a class where it’s included. But even if it’s true for now doesn’t mean other developers cannot add dependency later. There is no barrier.</p>

<h3 id="links">Links</h3>
<ul>
  <li><a href="http://ruby-doc.com/docs/ProgrammingRuby/html/tut_modules.html">The Pragmatic Programmer’s Guide - Modules</a></li>
</ul>]]></content><author><name>Oleg Antonyan</name></author><category term="ruby" /><summary type="html"><![CDATA[Mixins can be dangerous in many cases, avoid them if you can]]></summary></entry><entry><title type="html">Writing Ruby gem in Rust</title><link href="https://undefined-reference.org/2016/05/14/writing-rubygem-in-rust.html" rel="alternate" type="text/html" title="Writing Ruby gem in Rust" /><published>2016-05-14T05:12:28+00:00</published><updated>2016-05-14T05:12:28+00:00</updated><id>https://undefined-reference.org/2016/05/14/writing-rubygem-in-rust</id><content type="html" xml:base="https://undefined-reference.org/2016/05/14/writing-rubygem-in-rust.html"><![CDATA[<p>TL;DR: here is an <a href="https://github.com/olegantonyan/rustygem">example of a gem written in Rust</a>.</p>

<h4 id="why">Why?</h4>

<p>Ruby is slow, right? Most of the time we don’t care, but sometimes we do. And when we do, there are not so many options: C, C++, microservices/rpc/jruby, … . C is good enough to shot yourself in the foot. C++, well, just C++. Other options are to comprehensive for a simple task, like CPU intensive algorithm. You can probably use Go, but it has its own runtime with garbage collector which adds more overhead.</p>

<p>Rust is another option because of:</p>

<ul>
  <li>safety</li>
  <li>speed</li>
  <li>no runtime</li>
</ul>

<p>There are couple of challenges with Ruby-Rust integration (actually, for Ruby-whatever integration). This post is about them.</p>

<h4 id="passing-data-between-ruby-and-rust">Passing data between Ruby and Rust</h4>

<p>This is relatively easy when you are passing simple integers, but if you need to pass complex objects there is a lot of headache. You can avoid it by using JSON and passing it as string. If you need to call a function in Rust and get result of its CPU intensive calculation, then it’s OK to have JSON overhead.</p>

<p>One gotcha is that you have to deallocate memory allocated for <code class="language-plaintext highlighter-rouge">char *</code> inside Rust after it has been returned to Ruby. That’s why we have <code class="language-plaintext highlighter-rouge">rust_free</code> function in Rust, which is a wrapper for libc’s <code class="language-plaintext highlighter-rouge">free</code>:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">require</span> <span class="s1">'rustygem/version'</span>
<span class="nb">require</span> <span class="s1">'fiddle'</span>
<span class="nb">require</span> <span class="s1">'json'</span>

<span class="k">module</span> <span class="nn">Rustygem</span>
  <span class="vi">@lib</span> <span class="o">=</span> <span class="no">Fiddle</span><span class="p">.</span><span class="nf">dlopen</span><span class="p">(</span><span class="s2">"</span><span class="si">#{</span><span class="no">File</span><span class="p">.</span><span class="nf">dirname</span><span class="p">(</span><span class="kp">__FILE__</span><span class="p">)</span><span class="si">}</span><span class="s2">/../rust/target/release/librustygem.so"</span><span class="p">)</span>
  <span class="vi">@rust_perform</span> <span class="o">=</span> <span class="no">Fiddle</span><span class="o">::</span><span class="no">Function</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="vi">@lib</span><span class="p">[</span><span class="s1">'rust_perform'</span><span class="p">],</span> <span class="p">[</span><span class="no">Fiddle</span><span class="o">::</span><span class="no">TYPE_VOIDP</span><span class="p">],</span> <span class="no">Fiddle</span><span class="o">::</span><span class="no">TYPE_VOIDP</span><span class="p">)</span>
  <span class="vi">@rust_free</span> <span class="o">=</span> <span class="no">Fiddle</span><span class="o">::</span><span class="no">Function</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="vi">@lib</span><span class="p">[</span><span class="s1">'rust_free'</span><span class="p">],</span> <span class="p">[</span><span class="no">Fiddle</span><span class="o">::</span><span class="no">TYPE_VOIDP</span><span class="p">],</span> <span class="no">Fiddle</span><span class="o">::</span><span class="no">TYPE_VOID</span><span class="p">)</span>

  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">perform</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
    <span class="n">ptr</span> <span class="o">=</span> <span class="vi">@rust_perform</span><span class="p">.</span><span class="nf">call</span><span class="p">(</span><span class="n">arg</span><span class="p">.</span><span class="nf">to_json</span><span class="p">)</span> <span class="c1"># do the actual work</span>
    <span class="n">result</span> <span class="o">=</span> <span class="n">ptr</span><span class="p">.</span><span class="nf">to_s</span>
    <span class="vi">@rust_free</span><span class="p">.</span><span class="nf">call</span><span class="p">(</span><span class="n">ptr</span><span class="p">)</span> <span class="c1"># char* was allocated in Rust, so don't forget to free it</span>
    <span class="no">JSON</span><span class="p">.</span><span class="nf">parse</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
  <span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">#[no_mangle]</span>
<span class="k">pub</span> <span class="k">extern</span> <span class="s">"C"</span> <span class="k">fn</span> <span class="nf">rust_free</span><span class="p">(</span><span class="n">c_ptr</span><span class="p">:</span> <span class="o">*</span><span class="k">mut</span> <span class="nn">libc</span><span class="p">::</span><span class="nb">c_void</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">unsafe</span> <span class="p">{</span>
        <span class="nn">libc</span><span class="p">::</span><span class="nf">free</span><span class="p">(</span><span class="n">c_ptr</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Check out <a href="https://github.com/olegantonyan/rustygem">rustygem</a> for more details.</p>

<h4 id="building-dynamic-library-when-installing-the-gem">Building dynamic library when installing the gem</h4>

<p>Ruby gems have builtin mechanism for building native extensions in C. But what about Rust? Actually, we don’t need any external tools to build Rust library because in Rust we have Cargo which is very similar to bundler. So, the only thing we need to do is call <code class="language-plaintext highlighter-rouge">cargo build</code> inside Rust project. But how to do this when installing the gem? Turns out this is very simple. Just put <code class="language-plaintext highlighter-rouge">Makefile</code> along with empty <code class="language-plaintext highlighter-rouge">extconf.rb</code> and add <code class="language-plaintext highlighter-rouge">extconf.rb</code> to gemspec.</p>

<div class="language-makefile highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># rust/Makefile:
</span><span class="nl">all</span><span class="o">:</span>
	cargo build <span class="nt">--release</span>

<span class="nl">clean</span><span class="o">:</span>
	<span class="nb">rm</span> <span class="nt">-rf</span> target

<span class="nl">install</span><span class="o">:</span> <span class="nf">;</span>
</code></pre></div></div>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># gemspec</span>
<span class="n">spec</span><span class="p">.</span><span class="nf">extensions</span> <span class="o">=</span> <span class="no">Dir</span><span class="p">[</span><span class="s1">'rust/extconf.rb'</span><span class="p">]</span>
</code></pre></div></div>

<p>Optionally, you can put some checks into <code class="language-plaintext highlighter-rouge">extconf.rb</code>:</p>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># rust/extconf.rb</span>
<span class="k">raise</span> <span class="s1">'You have to install Rust with Cargo (https://www.rust-lang.org/)'</span> <span class="k">if</span> <span class="o">!</span><span class="nb">system</span><span class="p">(</span><span class="s1">'cargo --version'</span><span class="p">)</span> <span class="o">||</span> <span class="o">!</span><span class="nb">system</span><span class="p">(</span><span class="s1">'rustc --version'</span><span class="p">)</span>
</code></pre></div></div>

<h3 id="conclusion">Conclusion</h3>

<p>There is an alternative to C. And it’s not so hard to use Rust in Ruby project.</p>

<p>This post illustrates very basic approach to integration Rust with Ruby. There is <a href="https://github.com/rustbridge/helix">Helix project</a> which is much more comprehensive. Check it out if you want less boilerplate and more nice API.</p>

<h3 id="links">Links</h3>
<ul>
  <li><a href="https://github.com/olegantonyan/rustygem">rustygem - an example gem written in Rust</a></li>
  <li><a href="http://blog.skylight.io/bending-the-curve-writing-safe-fast-native-gems-with-rust/">Bending the Curve: Writing Safe &amp; Fast Native Gems With Rust</a></li>
  <li><a href="https://github.com/rustbridge/helix">Helix project</a></li>
  <li><a href="http://stackoverflow.com/questions/37102967/how-can-i-build-a-rust-library-when-installing-a-gem">SO: How can I build a Rust library when installing a gem?</a></li>
  <li><a href="http://confreaks.tv/videos/railsconf2016-turbo-rails-with-rust">Turbo Rails with Rust by Godfrey Chan</a></li>
  <li><a href="https://github.com/flajann2/juwelier">Opinionated tool for creating and managing Rubygem projects using Ruby 2.3 and beyond. Supports Rusty gems</a></li>
</ul>]]></content><author><name>Oleg Antonyan</name></author><category term="ruby" /><category term="rust" /><summary type="html"><![CDATA[How to integrate Rust with Ruby]]></summary></entry><entry><title type="html">I18n for data in your models</title><link href="https://undefined-reference.org/2016/04/01/translateable-attributes-data.html" rel="alternate" type="text/html" title="I18n for data in your models" /><published>2016-04-01T11:52:28+00:00</published><updated>2016-04-01T11:52:28+00:00</updated><id>https://undefined-reference.org/2016/04/01/translateable-attributes-data</id><content type="html" xml:base="https://undefined-reference.org/2016/04/01/translateable-attributes-data.html"><![CDATA[<p>Recently I needed to store text data in multiple languages at the same time. After a quick googling I found a <a href="https://github.com/globalize/globalize">globalize gem</a> which does exactly what I need.</p>

<p>But there are couple issues with it:</p>

<ol>
  <li>doesn’t support rails 5 <a href="https://github.com/globalize/globalize/issues/473">yet</a>;</li>
  <li>creates additional tables to store translated data;</li>
  <li>requires you to reference models in migration, which is <a href="http://www.pervasivecode.com/blog/2010/03/18/rails-migration-antipatterns-and-how-to-fix-them">anti-pattern</a>.</li>
</ol>

<p>It’s somewhat OK to live with 2 and 3, but not with 1 if you are on rails 5.</p>

<p>That’s why I’ve created another solution and extracted it into a <a href="https://github.com/olegantonyan/translateable">gem</a>.</p>

<p>The idea is very simple: save all translation data in one field. It’s possible to do so even with serializable attribute, but much better is to use <code class="language-plaintext highlighter-rouge">jsonb</code> type in PostgreSQL 9.4. It’s indexed and you can query it just like any data.</p>

<p>ActiveRecord supports jsonb since 4.2 so you can work with those fields just like with hashes.</p>

<p>So, let’s save translatable text data under a key, representing locale:</p>

<figure class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">{</span><span class="w"> </span><span class="nl">"en"</span><span class="p">:</span><span class="w"> </span><span class="s2">"hello"</span><span class="p">,</span><span class="w"> </span><span class="nl">"ru"</span><span class="p">:</span><span class="w"> </span><span class="s2">"привет"</span><span class="p">,</span><span class="w"> </span><span class="nl">"it"</span><span class="p">:</span><span class="w"> </span><span class="s2">"ciao"</span><span class="w"> </span><span class="p">}</span></code></pre></figure>

<p>Now, with a very little abstraction you can do this:</p>

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="no">I18n</span><span class="p">.</span><span class="nf">locale</span> <span class="o">=</span> <span class="ss">:en</span>
<span class="n">post</span> <span class="o">=</span> <span class="no">Post</span><span class="p">.</span><span class="nf">create</span><span class="p">(</span><span class="ss">title: </span><span class="s1">'hello'</span><span class="p">)</span>
<span class="n">post</span><span class="p">.</span><span class="nf">title</span> <span class="c1">#=&gt; hello</span>
<span class="no">I18n</span><span class="p">.</span><span class="nf">locale</span> <span class="o">=</span> <span class="ss">:ru</span>
<span class="n">post</span><span class="p">.</span><span class="nf">update</span><span class="p">(</span><span class="ss">title: </span><span class="s1">'привет'</span><span class="p">)</span>
<span class="n">post</span><span class="p">.</span><span class="nf">title</span> <span class="c1">#=&gt; привет</span></code></pre></figure>

<p>Also, it’s very easy to manage multiple languages in a single form if you treat them as nested attributes:</p>

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">Post</span> <span class="o">&lt;</span> <span class="no">ActiveRecord</span><span class="o">::</span><span class="no">Base</span>
  <span class="k">def</span> <span class="nf">title_translateable_attributes</span><span class="o">=</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
    <span class="nb">self</span><span class="p">[</span><span class="ss">:title</span><span class="p">]</span> <span class="o">=</span> <span class="n">arg</span><span class="p">.</span><span class="nf">each_with_object</span><span class="p">({})</span> <span class="k">do</span> <span class="o">|</span><span class="n">i</span><span class="p">,</span> <span class="n">obj</span><span class="o">|</span>
      <span class="nb">hash</span> <span class="o">=</span> <span class="n">i</span><span class="p">.</span><span class="nf">second</span>
      <span class="k">next</span> <span class="k">if</span> <span class="nb">hash</span><span class="p">[</span><span class="ss">:_destroy</span><span class="p">]</span>
      <span class="n">obj</span><span class="p">[</span><span class="nb">hash</span><span class="p">[</span><span class="ss">:locale</span><span class="p">]]</span> <span class="o">=</span> <span class="nb">hash</span><span class="p">[</span><span class="ss">:data</span><span class="p">]</span>
    <span class="k">end</span>
  <span class="k">end</span>
<span class="k">end</span></code></pre></figure>

<p>Together with <a href="https://github.com/ncri/nested_form_fields">nested_form_fields</a> you can add/delete translations dynamically in a single form.</p>

<h3 id="conclusion">Conclusion</h3>

<p>This very simple idea illustrates yet another use case for <code class="language-plaintext highlighter-rouge">jsonb</code> type. Don’t be afraid of it.</p>

<p>However, it requires you to write raw SQL queries, like this:</p>

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="no">Post</span><span class="p">.</span><span class="nf">where</span><span class="p">(</span><span class="s2">"title-&gt;&gt;'en' = ?"</span><span class="p">,</span> <span class="s1">'hello'</span><span class="p">))</span>
<span class="c1"># more examples in gem's readme</span></code></pre></figure>

<p>But, imo this is better than joins with additional tables.</p>

<h3 id="links">Links</h3>
<ul>
  <li><a href="https://github.com/olegantonyan/translateable">translateable gem</a></li>
  <li><a href="http://nandovieira.com/using-postgresql-and-jsonb-with-ruby-on-rails">Using PostgreSQL and jsonb with Ruby on Rails</a></li>
  <li><a href="http://schinckel.net/2014/05/25/querying-json-in-postgres/">Querying JSON in Postgres</a></li>
  <li><a href="http://stackoverflow.com/questions/36250331/query-postgres-jsonb-by-value-regardless-of-keys/36251296#36251296">Query postgres jsonb by value regardless of keys</a></li>
</ul>]]></content><author><name>Oleg Antonyan</name></author><category term="ruby" /><category term="rails" /><summary type="html"><![CDATA[How to store data in multiple languages]]></summary></entry><entry><title type="html">Resident eval - code: Ruby. Survival guide</title><link href="https://undefined-reference.org/2016/02/22/resident_eval-code_ruby.html" rel="alternate" type="text/html" title="Resident eval - code: Ruby. Survival guide" /><published>2016-02-22T10:16:28+00:00</published><updated>2016-02-22T10:16:28+00:00</updated><id>https://undefined-reference.org/2016/02/22/resident_eval-code_ruby</id><content type="html" xml:base="https://undefined-reference.org/2016/02/22/resident_eval-code_ruby.html"><![CDATA[<p>There are many many ways to evaluate any ruby code at runtime. Let’s look at them.</p>

<h4 id="eval">eval</h4>

<p>The most basic and well-known in other dynamic languages method. Receives a string and run it as a Ruby code.</p>

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="n">txt</span> <span class="o">=</span> <span class="s1">'hello'</span>
<span class="nb">eval</span> <span class="s2">"puts '</span><span class="si">#{</span><span class="n">txt</span><span class="si">}</span><span class="s2">'"</span>  <span class="c1">#=&gt; hello</span></code></pre></figure>

<p>Optionally you can pass a context which <code class="language-plaintext highlighter-rouge">eval</code> operates on with <code class="language-plaintext highlighter-rouge">binding</code>.</p>

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">def</span> <span class="nf">get_binding</span>
  <span class="nb">binding</span>
<span class="k">end</span>

<span class="k">class</span> <span class="nc">Klass</span>
  <span class="k">def</span> <span class="nf">initialize</span>
    <span class="vi">@var</span> <span class="o">=</span> <span class="mi">42</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">class_func</span>
    <span class="mi">11</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="nf">get_binding</span>
    <span class="nb">binding</span>
  <span class="k">end</span>
<span class="k">end</span>

<span class="nb">puts</span> <span class="nb">self</span>                                 <span class="c1">#=&gt; main</span>
<span class="nb">puts</span> <span class="nb">eval</span><span class="p">(</span><span class="s1">'self'</span><span class="p">,</span> <span class="n">get_binding</span><span class="p">)</span>            <span class="c1">#=&gt; main</span>
<span class="nb">puts</span> <span class="nb">eval</span><span class="p">(</span><span class="s1">'self'</span><span class="p">,</span> <span class="no">Klass</span><span class="p">.</span><span class="nf">new</span><span class="p">.</span><span class="nf">get_binding</span><span class="p">)</span>  <span class="c1">#=&gt; #&lt;Klass:0x007f77d1161728&gt;</span>
<span class="nb">puts</span> <span class="nb">eval</span><span class="p">(</span><span class="s1">'@var'</span><span class="p">,</span> <span class="no">Klass</span><span class="p">.</span><span class="nf">new</span><span class="p">.</span><span class="nf">get_binding</span><span class="p">)</span>  <span class="c1">#=&gt; 42</span></code></pre></figure>

<p>Binding allows you to capture current execution context. For example, it’s used by closures.</p>

<h4 id="instance_eval">instance_eval</h4>

<p>Allows you to operate on object with <code class="language-plaintext highlighter-rouge">self</code> set to this object. It also can accept block instead of string to evaluate it. Somewhat similar to <code class="language-plaintext highlighter-rouge">eval</code> with <code class="language-plaintext highlighter-rouge">binding</code>.</p>

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># self is also passed as a block argument</span>
<span class="no">Klass</span><span class="p">.</span><span class="nf">new</span><span class="p">.</span><span class="nf">instance_eval</span> <span class="k">do</span> <span class="o">|</span><span class="n">obj</span><span class="o">|</span>
  <span class="nb">puts</span> <span class="vi">@var</span>             <span class="c1">#=&gt; 42</span>
  <span class="nb">puts</span> <span class="nb">self</span>             <span class="c1">#=&gt; #&lt;Klass:0x007f0c71f4d7e0&gt;</span>
  <span class="nb">puts</span> <span class="n">obj</span> <span class="o">==</span> <span class="nb">self</span>      <span class="c1">#=&gt; true</span>
<span class="k">end</span>

<span class="c1"># Class itself in an instance of class `Class`</span>
<span class="no">Klass</span><span class="p">.</span><span class="nf">instance_eval</span> <span class="k">do</span> <span class="o">|</span><span class="n">obj</span><span class="o">|</span>
  <span class="nb">puts</span> <span class="n">class_func</span>       <span class="c1">#=&gt; 11</span>
  <span class="nb">puts</span> <span class="nb">self</span>             <span class="c1">#=&gt; Klass</span>
  <span class="nb">puts</span> <span class="n">obj</span> <span class="o">==</span> <span class="nb">self</span>      <span class="c1">#=&gt; true</span>
<span class="k">end</span>

<span class="c1"># works with string too</span>
<span class="no">Klass</span><span class="p">.</span><span class="nf">new</span><span class="p">.</span><span class="nf">instance_eval</span> <span class="s2">"puts @var"</span> <span class="c1">#=&gt; 42</span></code></pre></figure>

<h4 id="instance_exec">instance_exec</h4>

<p>Similar to <code class="language-plaintext highlighter-rouge">instance_eval</code>, but also allows you to pass an argument to a block.</p>

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># instance_exec can pass an argument(s)</span>
<span class="no">Klass</span><span class="p">.</span><span class="nf">new</span><span class="p">.</span><span class="nf">instance_exec</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">obj1</span><span class="p">,</span> <span class="n">obj2</span><span class="o">|</span>
  <span class="nb">puts</span> <span class="vi">@var</span>             <span class="c1">#=&gt; 42</span>
  <span class="nb">puts</span> <span class="nb">self</span>             <span class="c1">#=&gt; #&lt;Klass:0x007f1136e57060&gt;</span>
  <span class="nb">puts</span> <span class="n">obj1</span>             <span class="c1">#=&gt; 1</span>
  <span class="nb">puts</span> <span class="n">obj2</span>             <span class="c1">#=&gt; 2</span>
<span class="k">end</span>

<span class="c1"># for example, you can define methods dynamically with instance_exec</span>
<span class="n">instance</span> <span class="o">=</span> <span class="no">Klass</span><span class="p">.</span><span class="nf">new</span>
<span class="n">instance</span><span class="p">.</span><span class="nf">instance_exec</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">obj</span><span class="o">|</span>
  <span class="vi">@_obj</span> <span class="o">=</span> <span class="n">obj</span>
  <span class="k">def</span> <span class="nf">new_func</span>
    <span class="vi">@_obj</span>
  <span class="k">end</span>
<span class="k">end</span>
<span class="nb">puts</span> <span class="n">instance</span><span class="p">.</span><span class="nf">new_func</span>  <span class="c1">#=&gt; 3 (or nil if no arguments passed to instance_exec)</span>

<span class="c1"># works only with block</span>
<span class="no">Klass</span><span class="p">.</span><span class="nf">new</span><span class="p">.</span><span class="nf">instance_exec</span> <span class="s2">"puts 'hello'"</span> <span class="c1">#=&gt; no block given (LocalJumpError)</span></code></pre></figure>

<h4 id="class_eval">class_eval</h4>

<p>Similar to <code class="language-plaintext highlighter-rouge">instance_eval</code>, but operates on object itself. Available only on <code class="language-plaintext highlighter-rouge">Module</code> (<code class="language-plaintext highlighter-rouge">Class</code>).</p>

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="no">Klass</span><span class="p">.</span><span class="nf">class_eval</span> <span class="k">do</span> <span class="o">|</span><span class="n">obj</span><span class="o">|</span>
  <span class="nb">puts</span> <span class="n">obj</span>                  <span class="c1">#=&gt; Klass</span>
  <span class="k">def</span> <span class="nf">another_func</span>
    <span class="mi">14</span>
  <span class="k">end</span>
<span class="k">end</span>
<span class="nb">puts</span> <span class="no">Klass</span><span class="p">.</span><span class="nf">new</span><span class="p">.</span><span class="nf">another_func</span> <span class="c1">#=&gt; 14</span></code></pre></figure>

<h4 id="class_exec">class_exec</h4>

<p>Like <code class="language-plaintext highlighter-rouge">instance_exec</code> but for <code class="language-plaintext highlighter-rouge">class_eval</code>. Allows you to pass an argument to a block.</p>

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="no">Klass</span><span class="p">.</span><span class="nf">class_exec</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">obj</span><span class="o">|</span>
  <span class="nb">puts</span> <span class="n">obj</span>                  <span class="c1">#=&gt; 1 (or nil if no arguments passed to class_exec)</span>
  <span class="k">def</span> <span class="nf">yet_another_func</span>
    <span class="mi">18</span>
  <span class="k">end</span>
<span class="k">end</span>
<span class="nb">puts</span> <span class="no">Klass</span><span class="p">.</span><span class="nf">new</span><span class="p">.</span><span class="nf">yet_another_func</span> <span class="c1">#=&gt; 18</span>

<span class="c1"># because class_{exec,eval} opens `Klass` itlelf any @variables are class instance variables (like instance_exec on a class)</span>
<span class="c1"># but any methods defined are instance methods</span>
<span class="no">Klass</span><span class="p">.</span><span class="nf">class_exec</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">obj</span><span class="o">|</span>
  <span class="vi">@_obj</span> <span class="o">=</span> <span class="n">obj</span>
  <span class="nb">puts</span> <span class="vi">@_obj</span>                    <span class="c1">#=&gt; 1</span>
  <span class="k">def</span> <span class="nf">yet_another_func1</span>
    <span class="vi">@_obj</span>
  <span class="k">end</span>
<span class="k">end</span>
<span class="nb">puts</span> <span class="no">Klass</span><span class="p">.</span><span class="nf">new</span><span class="p">.</span><span class="nf">yet_another_func1</span> <span class="c1">#=&gt; nil</span>
<span class="nb">puts</span> <span class="no">Klass</span><span class="p">.</span><span class="nf">instance_variables</span>    <span class="c1">#=&gt; @_obj</span></code></pre></figure>

<h4 id="module_eval">module_eval</h4>

<p>Same as <code class="language-plaintext highlighter-rouge">class_eval</code>.</p>

<h4 id="module_exec">module_exec</h4>

<p>Same as <code class="language-plaintext highlighter-rouge">class_exec</code>.</p>

<h3 id="conclusion">Conclusion</h3>

<p><code class="language-plaintext highlighter-rouge">eval</code> is the most basic and well-known method. You can evaluate any Ruby code with it. But if you’re using <code class="language-plaintext highlighter-rouge">rubocop</code> it will yell at <code class="language-plaintext highlighter-rouge">eval</code> as a security issue. True, if you run <code class="language-plaintext highlighter-rouge">eval</code> against user-provided string it can be exploited like SQL-injection.</p>

<p>Other methods are a little bit safer since they accept block, not a string (don’t use strings with {instance,class,module}_eval).</p>

<p><code class="language-plaintext highlighter-rouge">obj.instance_{eval,exec}</code> operate on singleton class of an <code class="language-plaintext highlighter-rouge">obj</code>.</p>

<p><code class="language-plaintext highlighter-rouge">obj.{class,module}_{exec,eval}</code> operate on <code class="language-plaintext highlighter-rouge">obj</code> itself and available only on <code class="language-plaintext highlighter-rouge">Module</code> (<code class="language-plaintext highlighter-rouge">Class</code>).</p>

<p><code class="language-plaintext highlighter-rouge">{instance,module,class}_exec</code> allows you to pass an argument to eval’d block while <code class="language-plaintext highlighter-rouge">{instance,module,class}_eval</code> don’t.</p>

<p><code class="language-plaintext highlighter-rouge">{instance,module,class}_eval</code> can also accept string (just like regular <code class="language-plaintext highlighter-rouge">eval</code>).</p>

<h3 id="links">Links</h3>

<ul>
  <li><a href="https://4loc.wordpress.com/2009/05/29/eval-module_eval-and-instance_eval/">Eval, module_eval, and instance_eval</a></li>
  <li><a href="http://ruby-doc.org/core-2.3.0/Kernel.html#method-i-eval">Kernel#eval at ruby-doc.org</a></li>
  <li><a href="http://ruby-doc.org/core-2.3.0/BasicObject.html#method-i-instance_eval">BasicObject#instance_eval</a></li>
  <li><a href="http://ruby-doc.org/core-2.3.0/BasicObject.html#method-i-instance_exec">BasicObject#instance_exec</a></li>
  <li><a href="http://ruby-doc.org/core-2.3.0/Module.html#method-i-module_eval">Module#module_eval</a></li>
  <li><a href="http://ruby-doc.org/core-2.3.0/Module.html#method-i-module_exec">Module#module_exec</a></li>
  <li><a href="https://rubymonk.com/learning/books/5-metaprogramming-ruby-ascent/chapters/24-eval/lessons/68-class-eval">RubyMonk: Class eval</a></li>
  <li><a href="http://ruby-doc.org/core-2.3.0/Module.html#method-i-class_eval">Module#class_eval</a></li>
  <li><a href="http://ruby-doc.org/core-2.3.0/Module.html#method-i-class_exec">Module#class_exec</a></li>
  <li><a href="http://web.stanford.edu/~ouster/cgi-bin/cs142-winter15/classEval.php">Stanford CS 142: Understanding class_eval and instance_eval</a></li>
  <li><a href="http://mauricio.github.io/2009/06/04/understanding-class_eval-module_eval-and-instance_eval.html">Understanding class_eval, module_eval and instance_eval</a></li>
  <li><a href="http://stackoverflow.com/questions/9057711/what-is-the-difference-between-class-eval-class-exec-module-eval-and-module-ex">StackOverflow: What is the difference between class_eval, class_exec, module_eval and module_exec?</a></li>
  <li><a href="https://rubymonk.com/learning/books/5-metaprogramming-ruby-ascent/chapters/24-eval/lessons/63-eval">RubyMonk: Eval</a></li>
</ul>]]></content><author><name>Oleg Antonyan</name></author><category term="ruby" /><category term="metaprogramming" /><summary type="html"><![CDATA[Different methods to eval ruby code]]></summary></entry><entry><title type="html">Improve console print debugging experience</title><link href="https://undefined-reference.org/2016/01/31/super_awesome_print-as-debugger.html" rel="alternate" type="text/html" title="Improve console print debugging experience" /><published>2016-01-31T12:46:12+00:00</published><updated>2016-01-31T12:46:12+00:00</updated><id>https://undefined-reference.org/2016/01/31/super_awesome_print-as-debugger</id><content type="html" xml:base="https://undefined-reference.org/2016/01/31/super_awesome_print-as-debugger.html"><![CDATA[<p>There are 2 kinds of people: those how always use debugger, and those who use console print.
If you belong to the second group, then you probably have a problem with a lot of printing along with other (rails’) stuff. Your console output become messy pretty quickly and it’s hard to find required information.</p>

<p>There is nice <a href="https://github.com/michaeldv/awesome_print">awesome_print gem</a> which helps a lot with coloring and formatting output. It’s much nicer then <code class="language-plaintext highlighter-rouge">pp</code> and simple <code class="language-plaintext highlighter-rouge">puts</code>. But I like to do one little thing to make it even better:</p>

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">def</span> <span class="nf">sap</span> <span class="n">msg</span>
  <span class="n">ap</span> <span class="s2">"*** </span><span class="si">#{</span><span class="no">Time</span><span class="p">.</span><span class="nf">now</span><span class="si">}</span><span class="s2"> ***"</span><span class="p">,</span> <span class="ss">color: </span><span class="p">{</span><span class="ss">string: :green</span><span class="p">}</span>
  <span class="n">ap</span> <span class="n">msg</span><span class="p">.</span><span class="nf">class</span> <span class="k">if</span> <span class="n">msg</span><span class="p">.</span><span class="nf">respond_to?</span><span class="p">(</span><span class="ss">:class</span><span class="p">)</span>
  <span class="n">src</span> <span class="o">=</span> <span class="nb">caller</span><span class="p">.</span><span class="nf">first</span><span class="p">.</span><span class="nf">gsub</span><span class="p">(</span><span class="no">Rails</span><span class="p">.</span><span class="nf">root</span><span class="p">.</span><span class="nf">to_s</span> <span class="o">+</span> <span class="s1">'/'</span><span class="p">,</span> <span class="s1">''</span><span class="p">)</span>
  <span class="n">ap</span> <span class="n">src</span><span class="p">,</span> <span class="ss">color: </span><span class="p">{</span><span class="ss">string: :purpleish</span><span class="p">}</span>
  <span class="n">ap</span> <span class="n">msg</span>
  <span class="n">ap</span> <span class="s1">'*** END ***'</span><span class="p">,</span> <span class="ss">color: </span><span class="p">{</span><span class="ss">string: :green</span><span class="p">}</span>
<span class="k">end</span></code></pre></figure>

<p>As you can see, now every output will be wrapped inside <code class="language-plaintext highlighter-rouge">***</code> along with file/line and type of printed value. It helps a lot.</p>

<figure class="highlight"><pre><code class="language-text" data-lang="text">Started GET "/news/8" for 127.0.0.1 at 2016-01-31 15:21:00 +0200
Processing by NewsItemsController#show as HTML
  Parameters: {"id"=&gt;"8"}
  User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1  ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
  NewsItem Load (0.3ms)  SELECT  "news_items".* FROM "news_items" WHERE "news_items"."id" = $1 LIMIT 1  [["id", 8]]
"*** 2016-01-31 15:21:00 +0200 ***"
"app/controllers/news_items_controller.rb:16:in `show'"
#&lt;NewsItem:0x007f4b63f3c0e0&gt; {
            :id =&gt; 8,
          :body =&gt; "123234234",
    :created_at =&gt; Sun, 08 Nov 2015 16:24:49 UTC +00:00,
    :updated_at =&gt; Sun, 08 Nov 2015 16:24:49 UTC +00:00,
         :title =&gt; "4567"
}
"*** END ***"
  Rendered news_items/_single.html.haml (0.6ms)
  Rendered news_items/show.html.haml within layouts/application (2.1ms)
  Rendered layouts/_navbar.html.haml (2.9ms)
  Rendered layouts/_messages.html.haml (0.1ms)
  Rendered layouts/_footer.html.haml (3.8ms)
Completed 200 OK in 1362ms (Views: 1358.3ms | ActiveRecord: 0.6ms)</code></pre></figure>

<p>I use it in all my projects, so I created a <a href="https://github.com/olegantonyan/super_awesome_print">gem</a> to avoid copy-pasting.</p>

<h3 id="conclusion">Conclusion</h3>

<p>I almost never use debugger because console print is just enough in 99% cases. Not only with Ruby/Rails development, but with any technology I ever worked. If you use console print a lot, then you probably have your favorite set of tools. I’ll be glad to know your preference.</p>

<h3 id="links">Links</h3>

<ul>
  <li><a href="https://github.com/olegantonyan/super_awesome_print">super_awesome_print gem on github</a></li>
</ul>]]></content><author><name>Oleg Antonyan</name></author><category term="ruby" /><category term="debugging" /><summary type="html"><![CDATA[Improving console print debugging]]></summary></entry><entry><title type="html">Custom templates path for controller</title><link href="https://undefined-reference.org/2016/01/23/custom_templates_path_for_controller.html" rel="alternate" type="text/html" title="Custom templates path for controller" /><published>2016-01-23T08:41:12+00:00</published><updated>2016-01-23T08:41:12+00:00</updated><id>https://undefined-reference.org/2016/01/23/custom_templates_path_for_controller</id><content type="html" xml:base="https://undefined-reference.org/2016/01/23/custom_templates_path_for_controller.html"><![CDATA[<p>Sometimes you need to break rails’ conventions a little bit and set custom path for all templates per controller. Especially for the purpose of namespacing.</p>

<p>For example, you have a controller:</p>

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">UserGroupsController</span> <span class="o">&lt;</span> <span class="no">ApplicationController</span>
  <span class="k">def</span> <span class="nf">index</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="nf">show</span>
  <span class="k">end</span>
<span class="k">end</span></code></pre></figure>

<p>By default, rails will search for templates in <code class="language-plaintext highlighter-rouge">app/views/user_groups</code>.
But what if you want to put those templates in <code class="language-plaintext highlighter-rouge">app/views/users/groups</code>?
Instead of this:</p>

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">UserGroupsController</span> <span class="o">&lt;</span> <span class="no">ApplicationController</span>
  <span class="k">def</span> <span class="nf">index</span>
    <span class="n">render</span> <span class="s1">'users/groups/index'</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="nf">show</span>
    <span class="n">render</span> <span class="s1">'users/groups/show'</span>
  <span class="k">end</span>
<span class="k">end</span></code></pre></figure>

<p>You can do this:</p>

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">UserGroupsController</span> <span class="o">&lt;</span> <span class="no">ApplicationController</span>
  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">controller_path</span>
    <span class="s1">'users/groups'</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="nf">index</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="nf">show</span>
  <span class="k">end</span>
<span class="k">end</span></code></pre></figure>

<p>However, this will break controller’s spec.</p>

<p>There is another way to do this, however, with another limitation:</p>

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">UserGroupsController</span> <span class="o">&lt;</span> <span class="no">ApplicationController</span>
  <span class="n">prepend_view_path</span> <span class="s1">'app/views/users'</span>

  <span class="k">def</span> <span class="nf">index</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="nf">show</span>
  <span class="k">end</span>
<span class="k">end</span></code></pre></figure>

<p>Now rails will search for templates in <code class="language-plaintext highlighter-rouge">app/views/users/user_groups</code>. The limitation is that you must name a folder for your templates like a controller. For example, you cannot use <code class="language-plaintext highlighter-rouge">app/views/users/groups</code> as a folder for templates for <code class="language-plaintext highlighter-rouge">UserGroupsController</code>. You must name this folder <code class="language-plaintext highlighter-rouge">app/views/users/user_groups</code> because of the controller’s name.</p>

<h3 id="conclusion">Conclusion</h3>

<p>There are couple ways to set custom templates path per controller. Both have their downsides as a price for breaking conventions.</p>

<h3 id="links">Links</h3>

<ul>
  <li><a href="http://stackoverflow.com/questions/4301249/how-to-change-the-default-path-of-view-files-in-a-rails-3-controller/25194710#25194710">StackOverflow question</a></li>
  <li><a href="http://apidock.com/rails/AbstractController/Base/controller_path/class">controller_path reference on apidock.com</a></li>
  <li><a href="http://edgeapi.rubyonrails.org/classes/AbstractController/ViewPaths/ClassMethods.html#method-i-prepend_view_path">prepend_view_path reference</a></li>
</ul>]]></content><author><name>Oleg Antonyan</name></author><category term="rails" /><summary type="html"><![CDATA[Using ActionController::Base.controller_path or prepend_view_path to specify path for all templates]]></summary></entry><entry><title type="html">DRY with_options</title><link href="https://undefined-reference.org/2015/12/26/drying_your_classes_with_options.html" rel="alternate" type="text/html" title="DRY with_options" /><published>2015-12-26T10:35:55+00:00</published><updated>2015-12-26T10:35:55+00:00</updated><id>https://undefined-reference.org/2015/12/26/drying_your_classes_with_options</id><content type="html" xml:base="https://undefined-reference.org/2015/12/26/drying_your_classes_with_options.html"><![CDATA[<p>One of the cool features in <code class="language-plaintext highlighter-rouge">ActiveSupport</code> is <a href="http://apidock.com/rails/v4.2.1/Object/with_options"><code class="language-plaintext highlighter-rouge">with_options</code></a>.</p>

<p>It helps you remove duplication:</p>

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="n">belongs_to</span> <span class="ss">:playlist</span><span class="p">,</span> <span class="ss">touch: </span><span class="kp">true</span><span class="p">,</span>  <span class="ss">inverse_of: :devices</span>
<span class="n">belongs_to</span> <span class="ss">:company</span><span class="p">,</span>  <span class="ss">inverse_of: :devices</span></code></pre></figure>

<p>Will become:</p>

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="n">with_options</span> <span class="ss">inverse_of: :devices</span> <span class="k">do</span> <span class="o">|</span><span class="n">a</span><span class="o">|</span>
  <span class="n">a</span><span class="p">.</span><span class="nf">belongs_to</span> <span class="ss">:playlist</span><span class="p">,</span> <span class="ss">touch: </span><span class="kp">true</span>
  <span class="n">a</span><span class="p">.</span><span class="nf">belongs_to</span> <span class="ss">:company</span>
<span class="k">end</span></code></pre></figure>

<p>However, there is one gotcha which was unclear for me after reading apidock.</p>

<p>When using ActiveRecord associations you have to use block variable to define associations like in example above. So this:</p>

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="n">with_options</span> <span class="ss">inverse_of: :devices</span> <span class="k">do</span>
  <span class="n">belongs_to</span> <span class="ss">:playlist</span><span class="p">,</span> <span class="ss">touch: </span><span class="kp">true</span>
  <span class="n">belongs_to</span> <span class="ss">:company</span>
<span class="k">end</span></code></pre></figure>

<p>Will not work! However, when using validations, delegations, attr_* it’s not required and you can write this:</p>

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">User</span> <span class="o">&lt;</span> <span class="no">ActiveRecord</span><span class="o">::</span><span class="no">Base</span>
  <span class="n">with_options</span> <span class="ss">to: :profile</span><span class="p">,</span> <span class="ss">allow_nil: </span><span class="kp">true</span> <span class="k">do</span>
    <span class="n">delegate</span> <span class="ss">:locale</span><span class="p">,</span> <span class="ss">:email</span><span class="p">,</span> <span class="ss">:gender</span><span class="p">,</span> <span class="ss">:time_zone</span><span class="p">,</span> <span class="ss">:first_name</span><span class="p">,</span> <span class="ss">:last_name</span>
  <span class="k">end</span>

  <span class="n">with_options</span> <span class="ss">presence: </span><span class="kp">true</span> <span class="k">do</span>
    <span class="n">validates</span> <span class="ss">:login</span><span class="p">,</span> <span class="ss">length: </span><span class="p">{</span> <span class="ss">maximum: </span><span class="mi">256</span> <span class="p">}</span>
    <span class="n">validates</span> <span class="ss">:password</span>
  <span class="k">end</span>
<span class="k">end</span></code></pre></figure>

<h3 id="conclusion">Conclusion</h3>

<p>Use <code class="language-plaintext highlighter-rouge">with_options</code>, but remember to add block variable when using it for ActiveRecord associations.</p>

<h3 id="links">Links</h3>

<ul>
  <li><a href="ruby-doc.org/docs/keywords/1.9/Object.html">Reference on apidock.com</a></li>
  <li><a href="http://railscasts.com/episodes/42-with-options">RailsCasts#with_options</a></li>
</ul>]]></content><author><name>Oleg Antonyan</name></author><category term="ruby" /><category term="activesupport" /><category term="rails" /><summary type="html"><![CDATA[ActiveSupport's with_options helps you keep classes DRY]]></summary></entry><entry><title type="html">Ensure you understand ensure</title><link href="https://undefined-reference.org/2015/12/13/ensure-you-understand-ensure.html" rel="alternate" type="text/html" title="Ensure you understand ensure" /><published>2015-12-13T06:06:55+00:00</published><updated>2015-12-13T06:06:55+00:00</updated><id>https://undefined-reference.org/2015/12/13/ensure-you-understand-ensure</id><content type="html" xml:base="https://undefined-reference.org/2015/12/13/ensure-you-understand-ensure.html"><![CDATA[<p>Let’s look at this code:</p>

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">def</span> <span class="nf">func1</span>
  <span class="nb">puts</span> <span class="s2">"one"</span>
  <span class="k">return</span>
  <span class="nb">puts</span> <span class="s2">"two"</span>
<span class="k">ensure</span>
  <span class="nb">puts</span> <span class="s2">"ensure"</span>
<span class="k">end</span></code></pre></figure>

<p>How the result will look? Of course you’ll never see <code class="language-plaintext highlighter-rouge">"two"</code>, but what about <code class="language-plaintext highlighter-rouge">"ensure"</code>?</p>

<figure class="highlight"><pre><code class="language-text" data-lang="text">[13] pry(main)&gt; func1
one
ensure
nil
[14] pry(main)&gt;</code></pre></figure>

<p>Even you return from a function without exceptions, <code class="language-plaintext highlighter-rouge">ensure</code> gets executed.</p>

<p>Another example:</p>

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">def</span> <span class="nf">func2</span>
  <span class="mi">10</span><span class="p">.</span><span class="nf">times</span> <span class="k">do</span> <span class="o">|</span><span class="n">num</span><span class="o">|</span>
    <span class="k">begin</span>
      <span class="nb">puts</span> <span class="s2">"iteration </span><span class="si">#{</span><span class="n">num</span><span class="si">}</span><span class="s2">"</span>
      <span class="k">next</span> <span class="k">if</span> <span class="n">num</span><span class="p">.</span><span class="nf">even?</span>
      <span class="nb">puts</span> <span class="s2">"after iteration </span><span class="si">#{</span><span class="n">num</span><span class="si">}</span><span class="s2">"</span>
    <span class="k">ensure</span>
      <span class="nb">puts</span> <span class="s2">"ensure"</span>
    <span class="k">end</span>
  <span class="k">end</span>
<span class="k">end</span></code></pre></figure>

<p>And let’s look at result:</p>

<figure class="highlight"><pre><code class="language-text" data-lang="text">[18] pry(main)&gt; func2
iteration 0
ensure 0
iteration 1
after iteration 1
ensure 1
iteration 2
ensure 2
iteration 3
after iteration 3
ensure 3
iteration 4
ensure 4
iteration 5
after iteration 5
ensure 5
iteration 6
ensure 6
iteration 7
after iteration 7
ensure 7
iteration 8
ensure 8
iteration 9
after iteration 9
ensure 9
10
[19] pry(main)&gt;</code></pre></figure>

<p>It was very surprising for me in a contrast with Ruby’s “least surprise principle”. But <a href="ruby-doc.org/docs/keywords/1.9/Object.html">this is how it works</a>:</p>

<blockquote>
  <p>Marks the final, optional clause of a begin/end block, generally in cases where the block also contains a rescue clause. The code in the ensure clause is guaranteed to be executed, whether control flows to the rescue block or not.</p>
</blockquote>

<h3 id="conclusion">Conclusion</h3>

<p>Every time execution leaves <code class="language-plaintext highlighter-rouge">begin</code> block, <code class="language-plaintext highlighter-rouge">ensure</code> gets executed no matter what: exception, return, next, break, etc.</p>

<h3 id="links">Links</h3>

<ul>
  <li><a href="ruby-doc.org/docs/keywords/1.9/Object.html">Reference on ruby-doc.org</a></li>
  <li><a href="https://blog.newrelic.com/2014/12/10/weird-ruby-2-rescue-interrupt-ensure/">Weird Ruby Part 2: Exceptional Ensurance</a></li>
</ul>]]></content><author><name>Oleg Antonyan</name></author><category term="ruby" /><summary type="html"><![CDATA[Ruby's ensure sometimes may lead to not obvious behavior]]></summary></entry><entry><title type="html">Using service objects with CRUD interface, the smart way</title><link href="https://undefined-reference.org/2015/12/05/services-with-crud-interface-usage.html" rel="alternate" type="text/html" title="Using service objects with CRUD interface, the smart way" /><published>2015-12-05T09:27:09+00:00</published><updated>2015-12-05T09:27:09+00:00</updated><id>https://undefined-reference.org/2015/12/05/services-with-crud-interface-usage</id><content type="html" xml:base="https://undefined-reference.org/2015/12/05/services-with-crud-interface-usage.html"><![CDATA[<p><a href="/2015/11/28/crud_interface_for_service_objects.html">In a previous post</a> we saw how to create service objects with CRUD interface. Now let’s see why <s>you should care</s> it is useful.</p>

<p>REST architecture is about CRUD over http. Rails uses RESTful routes. And in every RESTful controller action you may find something like this:</p>

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">def</span> <span class="nf">create</span>
  <span class="vi">@post</span> <span class="o">=</span> <span class="no">Post</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="n">post_params</span><span class="p">)</span>

  <span class="k">if</span> <span class="vi">@post</span><span class="p">.</span><span class="nf">save</span>
    <span class="n">redirect_to</span> <span class="vi">@post</span><span class="p">,</span> <span class="ss">notice: </span><span class="s1">'Post was successfully updated.'</span> <span class="p">}</span>
  <span class="k">else</span>
    <span class="n">flash</span><span class="p">[</span><span class="ss">:alert</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"Error updating post: </span><span class="si">#{</span><span class="vi">@post</span><span class="p">.</span><span class="nf">errors</span><span class="p">.</span><span class="nf">full_messages</span><span class="p">.</span><span class="nf">to_sentence</span><span class="si">}</span><span class="s2">"</span>
    <span class="n">render</span> <span class="ss">:edit</span>
  <span class="k">end</span>
<span class="k">end</span>

<span class="k">def</span> <span class="nf">update</span>
  <span class="vi">@post</span> <span class="o">=</span> <span class="no">Post</span><span class="p">.</span><span class="nf">find</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="ss">:id</span><span class="p">])</span>

  <span class="k">if</span> <span class="vi">@post</span><span class="p">.</span><span class="nf">update</span><span class="p">(</span><span class="n">post_params</span><span class="p">)</span>
    <span class="n">redirect_to</span> <span class="vi">@post</span><span class="p">,</span> <span class="ss">notice: </span><span class="s1">'Post was successfully created.'</span>
  <span class="k">else</span>
    <span class="n">flash</span><span class="p">[</span><span class="ss">:alert</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"Error creating post: </span><span class="si">#{</span><span class="vi">@post</span><span class="p">.</span><span class="nf">errors</span><span class="p">.</span><span class="nf">full_messages</span><span class="p">.</span><span class="nf">to_sentence</span><span class="si">}</span><span class="s2">"</span>
    <span class="n">render</span> <span class="ss">:new</span>
  <span class="k">end</span>
<span class="k">end</span></code></pre></figure>

<p>Not very DRY, isn’t it? The only differences between these actions are:</p>

<ul>
  <li>Method called on a model</li>
  <li>Action on success</li>
  <li>Action on error</li>
  <li>Text in flash message on success</li>
  <li>Text in flash message on error</li>
</ul>

<p>What if we can extract them? We can decide which method to call on a model, where to redirect/render after, which flash messages to show by inspecting the model itself and a controller’s action.</p>

<p>But this is fine when you are dealing with <code class="language-plaintext highlighter-rouge">ActiveRecord</code> (<code class="language-plaintext highlighter-rouge">ActiveModel</code> to be precise) models. What if we are using service objects? One of the “canonical” way to use service objects is by calling <code class="language-plaintext highlighter-rouge">call</code> method, like this:</p>

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># app/services/create_membership_service.rb</span>
<span class="k">class</span> <span class="nc">CreateMembershipService</span>
  <span class="k">def</span> <span class="nf">call</span><span class="p">(</span><span class="n">options</span><span class="p">)</span>
    <span class="c1"># creating associations, sending notifications, etc</span>
  <span class="k">end</span>
<span class="k">end</span>

<span class="c1"># app/services/destroy_membership_service.rb</span>
<span class="k">class</span> <span class="nc">DestroyMembershipService</span>
  <span class="k">def</span> <span class="nf">call</span><span class="p">(</span><span class="n">options</span><span class="p">)</span>
    <span class="c1"># destroing associations, sending notifications, etc</span>
  <span class="k">end</span>
<span class="k">end</span>

<span class="c1"># app/controllers/memberships_controller.rb</span>
<span class="k">class</span> <span class="nc">MembershipsController</span> <span class="o">&lt;</span> <span class="no">ApplicationController</span>
  <span class="k">def</span> <span class="nf">create</span>
    <span class="k">if</span> <span class="no">CreateMembershipService</span><span class="p">.</span><span class="nf">new</span><span class="p">.</span><span class="nf">call</span>
      <span class="n">redirect_to</span> <span class="ss">:back</span><span class="p">,</span> <span class="ss">notice: </span><span class="s2">"Membership has been created"</span>
    <span class="k">else</span>
      <span class="n">flash</span><span class="p">[</span><span class="ss">:alert</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"Error creating membership"</span>
      <span class="n">render</span> <span class="ss">:edit</span>
    <span class="k">end</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="nf">destroy</span>
    <span class="k">if</span> <span class="no">DestroyMembershipService</span><span class="p">.</span><span class="nf">new</span><span class="p">.</span><span class="nf">call</span>
      <span class="n">redirect_to</span> <span class="ss">:back</span><span class="p">,</span> <span class="ss">notice: </span><span class="s2">"Membership has been destroyed"</span>
    <span class="k">else</span>
      <span class="n">flash</span><span class="p">[</span><span class="ss">:alert</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"Error destroying membership"</span>
      <span class="n">render</span> <span class="ss">:edit</span>
    <span class="k">end</span>
  <span class="k">end</span>
<span class="k">end</span></code></pre></figure>

<p>Again, not very DRY. And here comes services which behave like <code class="language-plaintext highlighter-rouge">ActiveModel</code> and use CRUD interface.</p>

<p>Also, let’s add some <code class="language-plaintext highlighter-rouge">magic</code> method which will call appopriate method on an object, redirect and show flashes:</p>

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># app/services/membership_service.rb</span>
<span class="k">class</span> <span class="nc">MembershipService</span>
  <span class="kp">include</span> <span class="no">ActiveModel</span><span class="o">::</span><span class="no">Model</span>

  <span class="k">def</span> <span class="nf">save</span>
    <span class="c1"># creating associations, sending notifications, etc</span>
    <span class="c1"># return true if ok, false otherwise and add messages to `errors`</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="nf">destroy</span>
    <span class="c1"># destroing associations, sending notifications, etc</span>
    <span class="c1"># return true if ok, false otherwise and add messages to `errors`</span>
  <span class="k">end</span>
<span class="k">end</span>

<span class="c1"># app/controllers/memberships_controller.rb</span>
<span class="k">class</span> <span class="nc">MembershipsController</span> <span class="o">&lt;</span> <span class="no">ApplicationController</span>
  <span class="k">def</span> <span class="nf">create</span>
    <span class="n">magic</span> <span class="no">MembershipService</span><span class="p">.</span><span class="nf">new</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="nf">destroy</span>
    <span class="n">magic</span> <span class="no">MembershipService</span><span class="p">.</span><span class="nf">new</span>
  <span class="k">end</span>
<span class="k">end</span></code></pre></figure>

<p>What inside <code class="language-plaintext highlighter-rouge">magic</code> function?</p>

<ul>
  <li>Check which actions it is called from by inspecting <code class="language-plaintext highlighter-rouge">caller</code></li>
  <li>Call <code class="language-plaintext highlighter-rouge">save</code> or <code class="language-plaintext highlighter-rouge">destroy</code> according to the action</li>
  <li>Redirect to appropriate url or render a template according to result of calling <code class="language-plaintext highlighter-rouge">save</code> or <code class="language-plaintext highlighter-rouge">destroy</code></li>
  <li>Show appropriate flash messages. In case of error - extract messages from <code class="language-plaintext highlighter-rouge">errors</code> object</li>
</ul>

<p>Not so magic, isn’t it? Luckily you don’t have to implement all this logic because I’ve already done this in <a href="https://github.com/olegantonyan/crud_responder" target="_blank">crud_responder</a> gem.</p>

<p>Now it’s very handy to have all domain objects (models and services) with CRUD interface so you can use them in controllers without worrying whether it’s ActiveRecord model or a service object.</p>]]></content><author><name>Oleg Antonyan</name></author><category term="ruby" /><category term="rails" /><category term="crud_responder" /><summary type="html"><![CDATA[User CRUD interface with your domain objects with crud_responder gem]]></summary></entry></feed>