{"id":47420,"date":"2015-11-06T17:41:18","date_gmt":"2015-11-06T14:41:18","guid":{"rendered":"https:\/\/www.altoros.com\/blog\/?p=47420"},"modified":"2021-08-25T19:57:46","modified_gmt":"2021-08-25T16:57:46","slug":"love-ruby","status":"publish","type":"post","link":"https:\/\/www.altoros.com\/blog\/love-ruby\/","title":{"rendered":"Love Ruby on Rails"},"content":{"rendered":"<p>&nbsp;<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-hierarchy ez-toc-counter ez-toc-transparent ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.altoros.com\/blog\/love-ruby\/#Ruby_on_Rails_vs_Nodejs\" >Ruby on Rails vs. Node.js<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.altoros.com\/blog\/love-ruby\/#Further_reading\" >Further reading<\/a><\/li><\/ul><\/nav><\/div>\n<h3><span class=\"ez-toc-section\" id=\"Ruby_on_Rails_vs_Nodejs\"><\/span>Ruby on Rails vs. Node.js<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2015\/11\/ruby-rails-logo-small.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2015\/11\/ruby-rails-logo-small.jpg\" alt=\"\" width=\"94\" height=\"120\" class=\"alignright size-full wp-image-57920\" \/><\/a><\/p>\n<p>Recently, I had a chance to try Node.js and plunge into the JavaScript world. For those who just started learning Node.js, but already have a Ruby-on-Rails background, it might be useful to associate some Ruby on Rails packages with Node.js packages.<\/p>\n<p><center><br \/>\n<small><\/p>\n<table>\n<thead>\n<tr style=\"background-color:#898f98;color:white;\">\n<th><center>Node.js<\/center><\/th>\n<th><center>Ruby on Rails<\/center><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>nvm<\/td>\n<td>rvm<\/td>\n<\/tr>\n<tr>\n<td>karma<\/td>\n<td>rake<\/td>\n<\/tr>\n<tr>\n<td>protractor<\/td>\n<td>rspec + capybara<\/td>\n<\/tr>\n<tr>\n<td>npm<\/td>\n<td>bundle<\/td>\n<\/tr>\n<tr>\n<td>express<\/td>\n<td>sinatra<\/td>\n<\/tr>\n<tr>\n<td>jasmine<\/td>\n<td>rspec<\/td>\n<\/tr>\n<tr>\n<td>npmjs.com<\/td>\n<td>rubygems.org<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><\/small><br \/>\n<\/center><\/p>\n<p>Please don\u2019t blame me, it is just a rough comparison.<\/p>\n<p>Here, I will look into the two technologies and compare them across a number of points.<\/p>\n<p>&nbsp;<br \/>\n<b>Implementing changes to functionality<\/b><\/p>\n<p><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2015\/11\/nodejs-logo-small.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2015\/11\/nodejs-logo-small.png\" alt=\"\" width=\"150\" height=\"40\" class=\"alignright size-full wp-image-57901\" \/><\/a><\/p>\n<p>The first problem I faced is the necessity to restart the server after each change. Hopefully, I discovered <a href=\"https:\/\/github.com\/remy\/nodemon\" rel=\"noopener noreferrer\" target=\"_blank\">nodemon<\/a> that helped to solve the issue. In Ruby on Rails, it\u2019s not necessary at least for the development environment.<\/p>\n<p>&nbsp;<br \/>\n<b>Debugging<\/b><\/p>\n<p>However, I had to debug soon and realized that I need to start the server with <code style=\"color: black; background-color: #e6e6e6;\">--debug flag + install node-inspector<\/code>, which opens Google Chrome development tools with all it\u2019s power. It\u2019s a big advantage, because you can see the full source file, as well as objects by just hovering a mouse on a variable and even edit the file. This advantage, though, easily turns into a weakness if you fork subprocesses, as you have to pass a unique debug port for each fork, and <code style=\"color: black; background-color: #e6e6e6;\">node-inspector<\/code> should be opened for each subprocess on a unique web port. I\u2019d prefer to use <a href=\"https:\/\/github.com\/pry\/pry\" rel=\"noopener noreferrer\" target=\"_blank\">Pry<\/a> or <a href=\"https:\/\/github.com\/deivid-rodriguez\/byebug\" rel=\"noopener noreferrer\" target=\"_blank\">Byebug<\/a> instead.<\/p>\n<p>I could accept this, because it\u2019s a different technology, but when I tried, <a href=\"https:\/\/www.protractortest.org\/\" rel=\"noopener noreferrer\" target=\"_blank\">Protractor<\/a> drove me mad. When I write <code style=\"color: black; background-color: #e6e6e6;\">browser.pause()<\/code>, it stops sending commands to <a href=\"https:\/\/en.wikipedia.org\/wiki\/Selenium_(software)\" rel=\"noopener noreferrer\" target=\"_blank\">Selenium<\/a>. Although I can open development tools, it\u2019s late already, as I can\u2019t check the Network tab to proceed with these tools, because the tab closes when I take the next step. Adding multiple pauses in the test doesn\u2019t make any sense, because command C is doing the next step without closing a debugger to proceed. Even if you type <code style=\"color: black; background-color: #e6e6e6;\">repl<\/code>, it\u2019s still impossible to check a variable in your test, because you are in a different fake context. <code style=\"color: black; background-color: #e6e6e6;\">browser.debugger()<\/code> works only if you add the <code style=\"color: black; background-color: #e6e6e6;\">--debug<\/code> key in the command line and stops at a fake context, as well. I understand that <code style=\"color: black; background-color: #e6e6e6;\">browser.pause()<\/code> is still experimental (too long). Why can\u2019t they allow to use a simple debugger without any wrappers? It seems that <a href=\"https:\/\/github.com\/webdriverio\/webdriverio\" rel=\"noopener noreferrer\" target=\"_blank\">WebdriverIO<\/a> allows for better debugging. I\u2019m going to try it.<\/p>\n<p>&nbsp;<br \/>\n<b>Creating separate repositories<\/b><\/p>\n<p>In addition, I noticed that some package authors create a separate repository for <a href=\"https:\/\/github.com\/bower\/bower\" rel=\"noopener noreferrer\" target=\"_blank\">Bower<\/a> releases. It\u2019s strange for me, because the <code style=\"color: black; background-color: #e6e6e6;\">bower.json<\/code> file can be created in the main repository. In Ruby on Rails, we are not creating a separate repository for <a href=\"https:\/\/rubygems.org\/\" rel=\"noopener noreferrer\" target=\"_blank\">RubyGems<\/a>. By the way, nodemon has recently released a new version that allows for deduplicating the same dependencies. Previously, they put all dependencies in a folder with a package. Now, all packages in <code style=\"color: black; background-color: #e6e6e6;\">node_modules<\/code> are flatten. <\/p>\n<p>&nbsp;<br \/>\n<b>Dealing with packages<\/b><\/p>\n<p>Updating packages in Ruby on Rails is also much more simple: bundle an update instead of <code style=\"color: black; background-color: #e6e6e6;\">npm update && npm update -g && npm update --dev && bower update<\/code>. You may have noticed that for the client side, a bundle is replaced with Bower. While for the server-side packages, they use <code style=\"color: black; background-color: #e6e6e6;\">npm<\/code>. It\u2019s due to different types of including packages (AMD, CommonJS, and ES). In Ruby on Rails, we have only one package. Even if you have Bower packages in the Ruby application, you can update them together with RubyGems thanks to <a href=\"https:\/\/rails-assets.org\/#\/\" rel=\"noopener noreferrer\" target=\"_blank\">Rails-Assets<\/a>. It\u2019s also funny to see that Bower bought an expensive domain, but can\u2019t afford more stable hosting. I saw several times when search packages are down. However, I\u2019ve never seen RubyGems down.<\/p>\n<p>&nbsp;<br \/>\n<b>Parsing HTTP files<\/b><\/p>\n<p>To get a file via HTTP, you need to install a special request parser, e.g., multiparty. Then you can work with a file in the same way as in Ruby on Rails.<\/p>\n<p>&nbsp;<br \/>\n<b>The <code style=\"color: black; background-color: #e6e6e6;\">sync<\/code> and <code style=\"color: black; background-color: #e6e6e6;\">async<\/code> functions<\/b><\/p>\n<p>In a node, some <code style=\"color: black; background-color: #e6e6e6;\">async<\/code> functions are duplicated with <code style=\"color: black; background-color: #e6e6e6;\">sync<\/code> analogs. It\u2019s very useful, because in tests, you will most likely use <code style=\"color: black; background-color: #e6e6e6;\">sync<\/code> analogs. While in an application, you may consider using <code style=\"color: black; background-color: #e6e6e6;\">async<\/code> function to speed up the response. Unfortunately, not all package authors duplicate their functions, and you may need to use the <code style=\"color: black; background-color: #e6e6e6;\">async<\/code> package to convert <code style=\"color: black; background-color: #e6e6e6;\">async<\/code> functions to <code style=\"color: black; background-color: #e6e6e6;\">sync<\/code> ones.<\/p>\n<p>Love Ruby on Rails!<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Further_reading\"><\/span>Further reading<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li><a href=\"https:\/\/www.altoros.com\/blog\/performance-comparison-of-ruby-frameworks-app-servers-template-engines-and-orms-2016\/\">Performance Comparison of Ruby Frameworks 2016<\/a><\/li>\n<li><a href=\"https:\/\/www.altoros.com\/blog\/simple-fast-application-sinatra-espresso-padrino-goliath-rails\/\">A Simple and a Fast App: Sinatra, Espresso, Padrino, Goliath, and Ruby on Rails<\/a><\/li>\n<li><a href=\"https:\/\/www.altoros.com\/research-papers\/performance-comparison-of-ruby-frameworks-app-servers-template-engines-and-orms\/\">Performance Comparison of Ruby Frameworks, App Servers, Template Engines, and ORMs<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>How I realized that I love Ruby<\/p>\n","protected":false},"author":62,"featured_media":57921,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"content-type":"","footnotes":"","_links_to":"","_links_to_target":""},"categories":[214],"tags":[1000,895],"class_list":["post-47420","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials","tag-github","tag-research-and-development"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Love Ruby on Rails | Altoros<\/title>\n<meta name=\"description\" content=\"This blog post compares Ruby on Rails and Node.js across a number of scenarios: implementing changes, debugging, dealing with packages, etc.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.altoros.com\/blog\/love-ruby\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Love Ruby on Rails | Altoros\" \/>\n<meta property=\"og:description\" content=\"How I realized that I love Ruby\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.altoros.com\/blog\/love-ruby\/\" \/>\n<meta property=\"og:site_name\" content=\"Altoros\" \/>\n<meta property=\"article:published_time\" content=\"2015-11-06T14:41:18+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-08-25T16:57:46+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2015\/11\/love-ruby-on-rails-featured-image-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"576\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Eugene Melnikov\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Eugene Melnikov\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.altoros.com\\\/blog\\\/love-ruby\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.altoros.com\\\/blog\\\/love-ruby\\\/\"},\"author\":{\"name\":\"Eugene Melnikov\",\"@id\":\"https:\\\/\\\/www.altoros.com\\\/blog\\\/#\\\/schema\\\/person\\\/2347aafc28e3658aea99b1b6671f7b70\"},\"headline\":\"Love Ruby on Rails\",\"datePublished\":\"2015-11-06T14:41:18+00:00\",\"dateModified\":\"2021-08-25T16:57:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.altoros.com\\\/blog\\\/love-ruby\\\/\"},\"wordCount\":749,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.altoros.com\\\/blog\\\/love-ruby\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.altoros.com\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/11\\\/love-ruby-on-rails-featured-image-1.png\",\"keywords\":[\"GitHub\",\"Research and Development\"],\"articleSection\":[\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.altoros.com\\\/blog\\\/love-ruby\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.altoros.com\\\/blog\\\/love-ruby\\\/\",\"url\":\"https:\\\/\\\/www.altoros.com\\\/blog\\\/love-ruby\\\/\",\"name\":\"Love Ruby on Rails | Altoros\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.altoros.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.altoros.com\\\/blog\\\/love-ruby\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.altoros.com\\\/blog\\\/love-ruby\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.altoros.com\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/11\\\/love-ruby-on-rails-featured-image-1.png\",\"datePublished\":\"2015-11-06T14:41:18+00:00\",\"dateModified\":\"2021-08-25T16:57:46+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.altoros.com\\\/blog\\\/#\\\/schema\\\/person\\\/2347aafc28e3658aea99b1b6671f7b70\"},\"description\":\"How I realized that I love Ruby\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.altoros.com\\\/blog\\\/love-ruby\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.altoros.com\\\/blog\\\/love-ruby\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.altoros.com\\\/blog\\\/love-ruby\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.altoros.com\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/11\\\/love-ruby-on-rails-featured-image-1.png\",\"contentUrl\":\"https:\\\/\\\/www.altoros.com\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/11\\\/love-ruby-on-rails-featured-image-1.png\",\"width\":1024,\"height\":576},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.altoros.com\\\/blog\\\/love-ruby\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.altoros.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Love Ruby on Rails\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.altoros.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.altoros.com\\\/blog\\\/\",\"name\":\"Altoros\",\"description\":\"Insight\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.altoros.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.altoros.com\\\/blog\\\/#\\\/schema\\\/person\\\/2347aafc28e3658aea99b1b6671f7b70\",\"name\":\"Eugene Melnikov\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.altoros.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/03\\\/melnikov-96x96.jpg\",\"url\":\"https:\\\/\\\/www.altoros.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/03\\\/melnikov-96x96.jpg\",\"contentUrl\":\"https:\\\/\\\/www.altoros.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/03\\\/melnikov-96x96.jpg\",\"caption\":\"Eugene Melnikov\"},\"description\":\"Eugene Melnikov is a senior software engineer at Altoros. He mainly specializes in Ruby and Ruby-based frameworks, as well as in JavaScript development, including Node.js, jQuery, and AngularJS. Working at Altoros, Eugene has also designed and implemented a variety of SQL and NoSQL database solutions. He recently became engaged in creating data-driven software for IoT applications. Check out Eugene's GitHub profile.\",\"url\":\"https:\\\/\\\/www.altoros.com\\\/blog\\\/author\\\/eugene-melnikov\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Love Ruby on Rails | Altoros","description":"This blog post compares Ruby on Rails and Node.js across a number of scenarios: implementing changes, debugging, dealing with packages, etc.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.altoros.com\/blog\/love-ruby\/","og_locale":"en_US","og_type":"article","og_title":"Love Ruby on Rails | Altoros","og_description":"How I realized that I love Ruby","og_url":"https:\/\/www.altoros.com\/blog\/love-ruby\/","og_site_name":"Altoros","article_published_time":"2015-11-06T14:41:18+00:00","article_modified_time":"2021-08-25T16:57:46+00:00","og_image":[{"width":1024,"height":576,"url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2015\/11\/love-ruby-on-rails-featured-image-1.png","type":"image\/png"}],"author":"Eugene Melnikov","twitter_misc":{"Written by":"Eugene Melnikov","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.altoros.com\/blog\/love-ruby\/#article","isPartOf":{"@id":"https:\/\/www.altoros.com\/blog\/love-ruby\/"},"author":{"name":"Eugene Melnikov","@id":"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/2347aafc28e3658aea99b1b6671f7b70"},"headline":"Love Ruby on Rails","datePublished":"2015-11-06T14:41:18+00:00","dateModified":"2021-08-25T16:57:46+00:00","mainEntityOfPage":{"@id":"https:\/\/www.altoros.com\/blog\/love-ruby\/"},"wordCount":749,"commentCount":0,"image":{"@id":"https:\/\/www.altoros.com\/blog\/love-ruby\/#primaryimage"},"thumbnailUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2015\/11\/love-ruby-on-rails-featured-image-1.png","keywords":["GitHub","Research and Development"],"articleSection":["Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.altoros.com\/blog\/love-ruby\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.altoros.com\/blog\/love-ruby\/","url":"https:\/\/www.altoros.com\/blog\/love-ruby\/","name":"Love Ruby on Rails | Altoros","isPartOf":{"@id":"https:\/\/www.altoros.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.altoros.com\/blog\/love-ruby\/#primaryimage"},"image":{"@id":"https:\/\/www.altoros.com\/blog\/love-ruby\/#primaryimage"},"thumbnailUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2015\/11\/love-ruby-on-rails-featured-image-1.png","datePublished":"2015-11-06T14:41:18+00:00","dateModified":"2021-08-25T16:57:46+00:00","author":{"@id":"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/2347aafc28e3658aea99b1b6671f7b70"},"description":"How I realized that I love Ruby","breadcrumb":{"@id":"https:\/\/www.altoros.com\/blog\/love-ruby\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.altoros.com\/blog\/love-ruby\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.altoros.com\/blog\/love-ruby\/#primaryimage","url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2015\/11\/love-ruby-on-rails-featured-image-1.png","contentUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2015\/11\/love-ruby-on-rails-featured-image-1.png","width":1024,"height":576},{"@type":"BreadcrumbList","@id":"https:\/\/www.altoros.com\/blog\/love-ruby\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.altoros.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Love Ruby on Rails"}]},{"@type":"WebSite","@id":"https:\/\/www.altoros.com\/blog\/#website","url":"https:\/\/www.altoros.com\/blog\/","name":"Altoros","description":"Insight","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.altoros.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/2347aafc28e3658aea99b1b6671f7b70","name":"Eugene Melnikov","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2020\/03\/melnikov-96x96.jpg","url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2020\/03\/melnikov-96x96.jpg","contentUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2020\/03\/melnikov-96x96.jpg","caption":"Eugene Melnikov"},"description":"Eugene Melnikov is a senior software engineer at Altoros. He mainly specializes in Ruby and Ruby-based frameworks, as well as in JavaScript development, including Node.js, jQuery, and AngularJS. Working at Altoros, Eugene has also designed and implemented a variety of SQL and NoSQL database solutions. He recently became engaged in creating data-driven software for IoT applications. Check out Eugene's GitHub profile.","url":"https:\/\/www.altoros.com\/blog\/author\/eugene-melnikov\/"}]}},"_links":{"self":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/47420","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/users\/62"}],"replies":[{"embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/comments?post=47420"}],"version-history":[{"count":14,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/47420\/revisions"}],"predecessor-version":[{"id":57897,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/47420\/revisions\/57897"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/media\/57921"}],"wp:attachment":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/media?parent=47420"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/categories?post=47420"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/tags?post=47420"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}