<?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>Forem: Othmane Namani</title>
    <description>The latest articles on Forem by Othmane Namani (@othman).</description>
    <link>https://forem.com/othman</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%2F239574%2F65ea7170-a007-4883-8741-cb7263da5a13.png</url>
      <title>Forem: Othmane Namani</title>
      <link>https://forem.com/othman</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/othman"/>
    <language>en</language>
    <item>
      <title>How to get a Rails Api model method in JSON.</title>
      <dc:creator>Othmane Namani</dc:creator>
      <pubDate>Sat, 28 Mar 2020 07:14:30 +0000</pubDate>
      <link>https://forem.com/othman/how-to-get-a-rails-api-model-method-in-json-3dgg</link>
      <guid>https://forem.com/othman/how-to-get-a-rails-api-model-method-in-json-3dgg</guid>
      <description>&lt;p&gt;Hi guys, this other article about web development with Ruby On Rails.&lt;/p&gt;

&lt;p&gt;We will learn how to include model methods in JSON, to use it as a JavaScript object attribute. But first, we should know what it is a Model, and what is JSON. We will see also in this article &lt;code&gt;as_json&lt;/code&gt; and &lt;code&gt;to_json&lt;/code&gt; methods.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;blockquote&gt;
&lt;strong&gt;"A Rails Model is a Ruby class that can add database records (think of whole rows in an Excel table),  find particular data you're looking for, update that data, or remove data. These common operations are referred to by the acronym CRUD - Create, Remove, Update, Destroy"&lt;/strong&gt;  -&lt;a href="https://codecabulary.launchacademy.com/learn-rails/writing-a-rails-model"&gt;LaunchAcademy&lt;/a&gt;.&lt;/blockquote&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is a Rails model example here:&lt;br&gt;
&lt;/p&gt;

&lt;div class="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;Person&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;
  &lt;span class="n"&gt;has_many&lt;/span&gt; &lt;span class="ss"&gt;:projects&lt;/span&gt;
  &lt;span class="n"&gt;validates&lt;/span&gt; &lt;span class="ss"&gt;:first_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;presence: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;
  &lt;span class="n"&gt;validates&lt;/span&gt; &lt;span class="ss"&gt;:last_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;presence: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;We have a model called &lt;code&gt;Person&lt;/code&gt;, which requires the presence of &lt;code&gt;first_name&lt;/code&gt; and &lt;code&gt;last_name&lt;/code&gt; attributes to create an instance of &lt;code&gt;Person&lt;/code&gt;, also it could have some projects. Let's see what is JSON.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;blockquote&gt;
&lt;strong&gt;"JSON stands for JavaScript Object Notation&lt;br&gt;
JSON is a lightweight format for storing and transporting data&lt;br&gt;
JSON is often used when data is sent from a server to a web page&lt;br&gt;
JSON is "self-describing" and easy to understand"&lt;/strong&gt;  -&lt;a href="https://www.w3schools.com/whatis/whatis_json.asp"&gt;W3scools&lt;/a&gt;.&lt;br&gt;
&lt;/blockquote&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A JSON example to show a users  object, &lt;code&gt;users&lt;/code&gt; contains an array of 3 users objects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"users"&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;
     &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"first_name"&lt;/span&gt;&lt;span class="ss"&gt;:"John"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"last_name"&lt;/span&gt;&lt;span class="ss"&gt;:"Doe"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
     &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"first_name"&lt;/span&gt;&lt;span class="ss"&gt;:"Anna"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"last_name"&lt;/span&gt;&lt;span class="ss"&gt;:"Smith"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
     &lt;span class="s2"&gt;"first_name"&lt;/span&gt;&lt;span class="ss"&gt;:"Peter"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"last_name"&lt;/span&gt;&lt;span class="ss"&gt;:"Jones"&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;To see how to convert a JSON text to a JavaScript object, just take one minute to read this &lt;a href="https://www.w3schools.com/whatis/whatis_json.asp"&gt;lesson&lt;/a&gt; on W3schools.&lt;/p&gt;

&lt;p&gt;So that was a brief introduction to Model and JSON with some examples.&lt;/p&gt;

&lt;p&gt;Now, we will add a method to our &lt;code&gt;Person&lt;/code&gt; model above. This is as simple as declaring a method in a Ruby class, let us call it &lt;code&gt;full_name&lt;/code&gt;.&lt;br&gt;
The model methods often use its model attributes, &lt;code&gt;full_name&lt;/code&gt; will take the &lt;code&gt;first_name&lt;/code&gt; and &lt;code&gt;last_name&lt;/code&gt; attributes and combines them to return the full name of a &lt;code&gt;Person&lt;/code&gt; instance.&lt;br&gt;
&lt;/p&gt;

&lt;div class="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;Person&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;
  &lt;span class="n"&gt;has_many&lt;/span&gt; &lt;span class="ss"&gt;:projects&lt;/span&gt;
  &lt;span class="n"&gt;validates&lt;/span&gt; &lt;span class="ss"&gt;:first_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;presence: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;
  &lt;span class="n"&gt;validates&lt;/span&gt; &lt;span class="ss"&gt;:last_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;presence: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;full_name&lt;/span&gt;
    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;first_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;last_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&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;In this case, any instance of &lt;code&gt;Person&lt;/code&gt; will get a full_name attribute. For example: if we create &lt;code&gt;person-1&lt;/code&gt; with a first name &lt;code&gt;"John"&lt;/code&gt;, and last name &lt;code&gt;"Doe"&lt;/code&gt;, &lt;code&gt;person-1.full_name&lt;/code&gt; will be &lt;code&gt;"John Doe"&lt;/code&gt;, but only with Ruby, because that is not the same thing for JSON.&lt;/p&gt;

&lt;p&gt;Using &lt;code&gt;to_json&lt;/code&gt; method will return a JSON string that includes the &lt;code&gt;person-1&lt;/code&gt; attributes and values. There will be no &lt;code&gt;full_name&lt;/code&gt; attribute,  &lt;code&gt;person-1.to_json&lt;/code&gt; will give us:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"first_name"&lt;/span&gt;&lt;span class="ss"&gt;:"John"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"last_name"&lt;/span&gt;&lt;span class="ss"&gt;:"Doe"&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Great! Our next step is to include &lt;code&gt;full_name&lt;/code&gt; attribute in JSON. To do this task we will use other Rails built-in method called &lt;code&gt;as_json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;What is &lt;code&gt;as_json&lt;/code&gt;? =&amp;gt; Take a look at this &lt;a href="https://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html#method-i-as_json"&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Well, &lt;code&gt;as_json&lt;/code&gt; method takes options as parameters, if we pass &lt;code&gt;:methods&lt;/code&gt; as options and call super we overwrite the method &lt;code&gt;to_json&lt;/code&gt; in our model, This will call &lt;code&gt;as_json&lt;/code&gt; method version of the super class with &lt;code&gt;:methods&lt;/code&gt; options, so that it will serialize our model with &lt;code&gt;full_name&lt;/code&gt; attribute.&lt;br&gt;
&lt;/p&gt;

&lt;div class="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;Person&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;
  &lt;span class="n"&gt;has_many&lt;/span&gt; &lt;span class="ss"&gt;:projects&lt;/span&gt;
  &lt;span class="n"&gt;validates&lt;/span&gt; &lt;span class="ss"&gt;:first_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;presence: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;
  &lt;span class="n"&gt;validates&lt;/span&gt; &lt;span class="ss"&gt;:last_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;presence: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;as_json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:methods&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:full_name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;super&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;full_name&lt;/span&gt;
    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;first_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;last_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&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;And now, we can see the &lt;code&gt;full_name&lt;/code&gt; attribute appeared in our JSON object, and &lt;code&gt;person-1.to_json&lt;/code&gt; now returns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"first_name"&lt;/span&gt;&lt;span class="ss"&gt;:"John"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"last_name"&lt;/span&gt;&lt;span class="ss"&gt;:"Doe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"full_name"&lt;/span&gt;&lt;span class="ss"&gt;:"John Doe"&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1ZtM8e3B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/vwb92p5jiua5wxn8xna5.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1ZtM8e3B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/vwb92p5jiua5wxn8xna5.jpg" alt="Json help Model method"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Like this, we could use a Rails API model method, as an attribute in JavaScript, after converting the JSON object to a JavaScript one.&lt;/p&gt;

&lt;p&gt;At last, I strongly recommend:&lt;br&gt;
This post on Stack-over-flow: &lt;a href="https://stackoverflow.com/questions/10821138/custom-model-method-that-should-be-included-in-json-serialization"&gt;https://stackoverflow.com/questions/10821138/custom-model-method-that-should-be-included-in-json-serialization&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Read about Rails Active Record for further understanding Rails Models: &lt;a href="https://guides.rubyonrails.org/active_record_basics.html"&gt;https://guides.rubyonrails.org/active_record_basics.html&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This article for a better understanding of what is to_json and as_json: &lt;a href="https://blog.arkency.com/how-to-overwrite-to-json-as-json-in-active-record-models-in-rails/"&gt;https://blog.arkency.com/how-to-overwrite-to-json-as-json-in-active-record-models-in-rails/&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>rails</category>
      <category>javascript</category>
      <category>json</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
