Imparare i fondamenti della gemma Nokogiri

Il mondo gira sempre più velocemente e questa accelerazione è evidente in tutti gli aspetti della nostra vita. Soprattutto quando si tratta di aziende, il premio sta nella velocità. In questa frenetica accelerazione, la volatilità è l’unica costante. Per stare al passo con il ritmo e stare al passo con una concorrenza sempre più agguerrita, le aziende sono alla ricerca di modi per aumentare l’efficienza e avere una maggiore velocità di immissione sul mercato. Questo spiega la frenesia dietro la popolarità di linguaggi di programmazione come Ruby on Rails. Ciò che rende Ruby on Rails ancora più sorprendente è l'enorme numero di gemme di cui è dotato. Immagina uno strumento e molto probabilmente lo hai nel tuo kit Ruby. Uno dei migliori gioielli per Ruby on Rails è Nokogiri che è una libreria per gestire documenti XML e HTML. L'uso più comune di un parser come Nokogiri è estrarre dati da documenti strutturati. Esempi:

  • Un elenco di prezzi da un sito Web di confronto dei prezzi.
  • Collegamenti ai risultati di ricerca da un motore di ricerca.
  • Un elenco di risposte da un sito di domande e risposte.

Installazione:

Sistema operativo X:

Per installare libxml2 da macports:

$ porta sudo installa libxml2 libxslt

Quindi per installare nokogiri:

$ sudo gem installa nokogiri

Linux:

Su Linux dobbiamo ancora installare libxml2. Il comando per installare libxml2 varierà in base al gestore pacchetti e alla distribuzione Linux che stiamo utilizzando.

Su Fedora:

$ sudo yum installa libxml2-devel libxslt-devel

La gemma $ installa nokogiri

Su Ubuntu:

$ sudo apt-get install libxml2 libxml2-dev libxslt libxslt-dev

La gemma $ installa nokogiri

Iniziare con Nokogiri:

Una volta installato Nokogiri possiamo iniziare a utilizzarlo. Nokogiri può utilizzare selettori XPath o CSS3. La capacità di utilizzare selettori CSS lo rende davvero ottimo per estrarre dati da documenti HTML.

richiedono "rubygems"

richiedono 'nokogiri'

richiedono 'open-uri'

Oltre a richiedere la gemma nokogiri avremmo bisogno di open-uri in modo che il contenuto di un URL possa essere facilmente trovato. Creiamo quindi un nuovo documento HTML Nokogiri e gli passiamo il contenuto della pagina dei risultati di ricerca. Con quel documento Nokogiri possiamo poi utilizzare at_css, passando il selettore CSS “title” per recuperare il contenuto del elemento. Il metodo at_css restituirà il primo elemento corrispondente e possiamo chiamare .text su quell'elemento per ottenere il suo contenuto testuale. Infine usiamo puts per stampare il testo.</html></p> <p><strong>Analisi di base:</strong></p> <p>Nokogiri ti consente di analizzare un documento HTML o XML utilizzando alcune strategie diverse:</p> <ul> <li>DOM</li> <li>SAX</li> <li>Lettore</li> <li>Tiro</li> </ul> <p>Ognuna di queste strategie presenta diversi vantaggi e svantaggi. L'interfaccia DOM è la più comune e generalmente considerata la più semplice da usare.</p> <p>Ogni prodotto che è l'ultimo articolo della riga ha una classe diversa:</p> <blockquote> <p><div class="”product" lastcol”><br><a href="/it/”/product/f05f/”/" class="”product_link”"><br><img<br>src="/images/dot_clear.gif"<br>title="Distruggi il sonno con questa potente dose di energia, in una bottiglia riutilizzabile per cartucce di fucile."<br>alt="Confezione da 3 colpi energetici Zombie Blast"<br>larghezza="125"<br>altezza = "125"<br>classe=”pigro”<br>data-original="http://a.tgcdn.net/images/products/thumb/largesquare/f05f_zombie_blast_energy_shots.jpg"<br>/><br><h4>Confezione da 3 colpi energetici Zombie Blast</h4><br></a><br><p>$9.99</p><br></div></p> </blockquote> <p>Ciò significa che per ottenere il nome dei prodotti, diremmo:</p> <p><strong>Inglese: </strong>Partendo dalla radice del documento: cerca in ogni div che ha un nome di classe contenente la parola "prodotto". All'interno troverai un collegamento. In quel collegamento trovi il testo h4.</p> <p><strong>XPath:</strong> //div[contiene(@class,'prodotto')]/a/h4</p> <p>L'operatore di uguaglianza XPath corrisponde solo a valori completi, in questo caso una stringa. XPath corrisponde solo a nomi di intere classi, quindi div[@class='product'] in XPath non funzionerebbe per ottenere l'ultima colonna come ci si potrebbe aspettare.</p> <p><strong>Riferimento:</strong></p> <p><a href="https://github.com/sparklemotion/nokogiri" target="_blank">https://github.com/sparklemotion/nokogiri</a><br></p> <p><!-- /wp:html --></p> </div> </div> </div> </div> </div> </section> <section class="elementor-section elementor-top-section elementor-element elementor-element-7fc30299 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="7fc30299" data-element_type="section" data-settings="{"background_background":"classic"}"> <div class="elementor-container elementor-column-gap-default"> <div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-51885040" data-id="51885040" data-element_type="column"> <div class="elementor-widget-wrap elementor-element-populated"> <div class="elementor-element elementor-element-6ea8ff86 elementor-widget elementor-widget-heading" data-id="6ea8ff86" data-element_type="widget" data-widget_type="heading.default"> <div class="elementor-widget-container"> <h2 class="elementor-heading-title elementor-size-default">Iscriviti per gli ultimi aggiornamenti</h2> </div> </div> <div class="elementor-element elementor-element-5ba6176f elementor-widget elementor-widget-shortcode" data-id="5ba6176f" data-element_type="widget" data-widget_type="shortcode.default"> <div class="elementor-widget-container"> <div class="elementor-shortcode"> <script type="text/javascript"> var gCaptchaSibWidget; var onloadSibCallback = function() { var element = document.getElementsByClassName('sib-default-btn'); gCaptchaSibWidget = grecaptcha.render(element[0],{ 'sitekey' : '6LdikOAaAAAAAJ6SWrrKVQrtw7TQpQAEnv0HS0G3', 'callback' : sibVerifyCallback }); }; </script> <script src="https://www.google.com/recaptcha/api.js?onload=onloadSibCallback&render=explicit" async defer></script> <form id="sib_signup_form_1" method="post" class="sib_signup_form"> <div class="sib_loader" style="display:none;"><img width="20" height="20" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2020%2020'%3E%3C/svg%3E" alt="caricatore" data-lazy-src="https://www.railscarma.com/wp-includes/images/spinner.gif"><noscript><img width="20" height="20" src="https://www.railscarma.com/wp-includes/images/spinner.gif" alt="caricatore"></noscript></div> <input type="hidden" name="sib_form_action" value="subscribe_form_submit"> <input type="hidden" name="sib_form_id" value="1"> <input type="hidden" name="sib_form_alert_notice" value="Please fill out this field"> <input type="hidden" name="sib_security" value="60c52b891c"> <div class="sib_signup_box_inside_1"> <div style="/*display:none*/" class="sib_msg_disp"> </div> <p class="sib-email-area"> <label class="sib-email-area"></label> <input type="email" class="sib-email-area" name="email" required="required" placeholder="Indirizzo e-mail"> </p> <p class="sib-NAME-area"> <label class="sib-NAME-area"></label> <input type="text" class="sib-NAME-area" name="NAME" placeholder="Nome" > </p> <p> <input type="submit" class="sib-default-btn" value="sottoscrivi"> </p> </div> <input type="hidden" name="trp-form-language" value="it"/></form> <style> form#sib_signup_form_1 p.sib-alert-message { padding: 6px 12px; margin-bottom: 20px; border: 1px solid transparent; border-radius: 4px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } form#sib_signup_form_1 p.sib-alert-message-error { background-color: #f2dede; border-color: #ebccd1; color: #a94442; } form#sib_signup_form_1 p.sib-alert-message-success { background-color: #dff0d8; border-color: #d6e9c6; color: #3c763d; } form#sib_signup_form_1 p.sib-alert-message-warning { background-color: #fcf8e3; border-color: #faebcc; color: #8a6d3b; } </style> </div> </div> </div> </div> </div> </div> </section> </div> <div class="related-post slider"> <div class="headline" >Articoli correlati</div> <div class="post-list owl-carousel"> <div class="item"> <div class="thumb post_thumb"> <a href="https://www.railscarma.com/it/blog/technical-articles/raschiamento-dei-dati-nei-binari-mediante-lelaborazione-di-csv/?related_post_from=31591"> <picture decoding="async" class="attachment-full size-full wp-post-image"> <source type="image/webp" data-lazy-srcset="https://www.railscarma.com/wp-content/uploads/2020/09/DATA-SCRAPING-IN-RAILS-BY-PROCESSING-CSV.png.webp 800w, https://www.railscarma.com/wp-content/uploads/2020/09/DATA-SCRAPING-IN-RAILS-BY-PROCESSING-CSV-300x113.png.webp 300w, https://www.railscarma.com/wp-content/uploads/2020/09/DATA-SCRAPING-IN-RAILS-BY-PROCESSING-CSV-768x288.png.webp 768w" srcset="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20800%20300'%3E%3C/svg%3E" data-lazy-sizes="(max-width: 800px) 100vw, 800px"/> <img decoding="async" width="800" height="300" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20800%20300'%3E%3C/svg%3E" alt="" data-lazy-srcset="https://www.railscarma.com/wp-content/uploads/2020/09/DATA-SCRAPING-IN-RAILS-BY-PROCESSING-CSV.png 800w, https://www.railscarma.com/wp-content/uploads/2020/09/DATA-SCRAPING-IN-RAILS-BY-PROCESSING-CSV-300x113.png 300w, https://www.railscarma.com/wp-content/uploads/2020/09/DATA-SCRAPING-IN-RAILS-BY-PROCESSING-CSV-768x288.png 768w" data-lazy-sizes="(max-width: 800px) 100vw, 800px" data-lazy-src="https://www.railscarma.com/wp-content/uploads/2020/09/DATA-SCRAPING-IN-RAILS-BY-PROCESSING-CSV.png"/> </picture> <noscript><picture loading="lazy" decoding="async" class="attachment-full size-full wp-post-image"> <source type="image/webp" srcset="https://www.railscarma.com/wp-content/uploads/2020/09/DATA-SCRAPING-IN-RAILS-BY-PROCESSING-CSV.png.webp 800w, https://www.railscarma.com/wp-content/uploads/2020/09/DATA-SCRAPING-IN-RAILS-BY-PROCESSING-CSV-300x113.png.webp 300w, https://www.railscarma.com/wp-content/uploads/2020/09/DATA-SCRAPING-IN-RAILS-BY-PROCESSING-CSV-768x288.png.webp 768w" sizes="(max-width: 800px) 100vw, 800px"/> <img loading="lazy" decoding="async" width="800" height="300" src="https://www.railscarma.com/wp-content/uploads/2020/09/DATA-SCRAPING-IN-RAILS-BY-PROCESSING-CSV.png" alt="" srcset="https://www.railscarma.com/wp-content/uploads/2020/09/DATA-SCRAPING-IN-RAILS-BY-PROCESSING-CSV.png 800w, https://www.railscarma.com/wp-content/uploads/2020/09/DATA-SCRAPING-IN-RAILS-BY-PROCESSING-CSV-300x113.png 300w, https://www.railscarma.com/wp-content/uploads/2020/09/DATA-SCRAPING-IN-RAILS-BY-PROCESSING-CSV-768x288.png 768w" sizes="(max-width: 800px) 100vw, 800px"/> </picture> </noscript> </a> </div> <a class="title post_title" href="https://www.railscarma.com/it/blog/technical-articles/raschiamento-dei-dati-nei-binari-mediante-lelaborazione-di-csv/?related_post_from=31591"> Scraping dei dati nelle rotaie mediante elaborazione CSV </a> </div> <div class="item"> <div class="thumb post_thumb"> <a href="https://www.railscarma.com/it/blog/technical-articles/come-ripristinare-il-commit-da-github/?related_post_from=31361"> <picture decoding="async" class="attachment-full size-full wp-post-image"> <source type="image/webp" data-lazy-srcset="https://www.railscarma.com/wp-content/uploads/2020/07/HOW-TO-REVERT-COMMIT-FROM-GITHUB-1.png.webp 800w, https://www.railscarma.com/wp-content/uploads/2020/07/HOW-TO-REVERT-COMMIT-FROM-GITHUB-1-300x113.png.webp 300w, https://www.railscarma.com/wp-content/uploads/2020/07/HOW-TO-REVERT-COMMIT-FROM-GITHUB-1-768x288.png.webp 768w" srcset="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20800%20300'%3E%3C/svg%3E" data-lazy-sizes="(max-width: 800px) 100vw, 800px"/> <img decoding="async" width="800" height="300" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20800%20300'%3E%3C/svg%3E" alt="" data-lazy-srcset="https://www.railscarma.com/wp-content/uploads/2020/07/HOW-TO-REVERT-COMMIT-FROM-GITHUB-1.png 800w, https://www.railscarma.com/wp-content/uploads/2020/07/HOW-TO-REVERT-COMMIT-FROM-GITHUB-1-300x113.png 300w, https://www.railscarma.com/wp-content/uploads/2020/07/HOW-TO-REVERT-COMMIT-FROM-GITHUB-1-768x288.png 768w" data-lazy-sizes="(max-width: 800px) 100vw, 800px" data-lazy-src="https://www.railscarma.com/wp-content/uploads/2020/07/HOW-TO-REVERT-COMMIT-FROM-GITHUB-1.png"/> </picture> <noscript><picture loading="lazy" decoding="async" class="attachment-full size-full wp-post-image"> <source type="image/webp" srcset="https://www.railscarma.com/wp-content/uploads/2020/07/HOW-TO-REVERT-COMMIT-FROM-GITHUB-1.png.webp 800w, https://www.railscarma.com/wp-content/uploads/2020/07/HOW-TO-REVERT-COMMIT-FROM-GITHUB-1-300x113.png.webp 300w, https://www.railscarma.com/wp-content/uploads/2020/07/HOW-TO-REVERT-COMMIT-FROM-GITHUB-1-768x288.png.webp 768w" sizes="(max-width: 800px) 100vw, 800px"/> <img loading="lazy" decoding="async" width="800" height="300" src="https://www.railscarma.com/wp-content/uploads/2020/07/HOW-TO-REVERT-COMMIT-FROM-GITHUB-1.png" alt="" srcset="https://www.railscarma.com/wp-content/uploads/2020/07/HOW-TO-REVERT-COMMIT-FROM-GITHUB-1.png 800w, https://www.railscarma.com/wp-content/uploads/2020/07/HOW-TO-REVERT-COMMIT-FROM-GITHUB-1-300x113.png 300w, https://www.railscarma.com/wp-content/uploads/2020/07/HOW-TO-REVERT-COMMIT-FROM-GITHUB-1-768x288.png 768w" sizes="(max-width: 800px) 100vw, 800px"/> </picture> </noscript> </a> </div> <a class="title post_title" href="https://www.railscarma.com/it/blog/technical-articles/come-ripristinare-il-commit-da-github/?related_post_from=31361"> Come ripristinare il commit da GitHub </a> </div> <div class="item"> <div class="thumb post_thumb"> <a href="https://www.railscarma.com/it/blog/technical-articles/effettuare-chiamate-vocali-tramite-le-applicazioni-web-ruby-on-rails/?related_post_from=31309"> <picture decoding="async" class="attachment-full size-full wp-post-image"> <source type="image/webp" data-lazy-srcset="https://www.railscarma.com/wp-content/uploads/2020/07/MAKE-VOICE-CALLS-THROUGH-RUBY-ON-RAILS-WEB-APPLICATIONS.png.webp 800w, https://www.railscarma.com/wp-content/uploads/2020/07/MAKE-VOICE-CALLS-THROUGH-RUBY-ON-RAILS-WEB-APPLICATIONS-300x113.png.webp 300w, https://www.railscarma.com/wp-content/uploads/2020/07/MAKE-VOICE-CALLS-THROUGH-RUBY-ON-RAILS-WEB-APPLICATIONS-768x288.png.webp 768w" srcset="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20800%20300'%3E%3C/svg%3E" data-lazy-sizes="(max-width: 800px) 100vw, 800px"/> <img decoding="async" width="800" height="300" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20800%20300'%3E%3C/svg%3E" alt="" data-lazy-srcset="https://www.railscarma.com/wp-content/uploads/2020/07/MAKE-VOICE-CALLS-THROUGH-RUBY-ON-RAILS-WEB-APPLICATIONS.png 800w, https://www.railscarma.com/wp-content/uploads/2020/07/MAKE-VOICE-CALLS-THROUGH-RUBY-ON-RAILS-WEB-APPLICATIONS-300x113.png 300w, https://www.railscarma.com/wp-content/uploads/2020/07/MAKE-VOICE-CALLS-THROUGH-RUBY-ON-RAILS-WEB-APPLICATIONS-768x288.png 768w" data-lazy-sizes="(max-width: 800px) 100vw, 800px" data-lazy-src="https://www.railscarma.com/wp-content/uploads/2020/07/MAKE-VOICE-CALLS-THROUGH-RUBY-ON-RAILS-WEB-APPLICATIONS.png"/> </picture> <noscript><picture loading="lazy" decoding="async" class="attachment-full size-full wp-post-image"> <source type="image/webp" srcset="https://www.railscarma.com/wp-content/uploads/2020/07/MAKE-VOICE-CALLS-THROUGH-RUBY-ON-RAILS-WEB-APPLICATIONS.png.webp 800w, https://www.railscarma.com/wp-content/uploads/2020/07/MAKE-VOICE-CALLS-THROUGH-RUBY-ON-RAILS-WEB-APPLICATIONS-300x113.png.webp 300w, https://www.railscarma.com/wp-content/uploads/2020/07/MAKE-VOICE-CALLS-THROUGH-RUBY-ON-RAILS-WEB-APPLICATIONS-768x288.png.webp 768w" sizes="(max-width: 800px) 100vw, 800px"/> <img loading="lazy" decoding="async" width="800" height="300" src="https://www.railscarma.com/wp-content/uploads/2020/07/MAKE-VOICE-CALLS-THROUGH-RUBY-ON-RAILS-WEB-APPLICATIONS.png" alt="" srcset="https://www.railscarma.com/wp-content/uploads/2020/07/MAKE-VOICE-CALLS-THROUGH-RUBY-ON-RAILS-WEB-APPLICATIONS.png 800w, https://www.railscarma.com/wp-content/uploads/2020/07/MAKE-VOICE-CALLS-THROUGH-RUBY-ON-RAILS-WEB-APPLICATIONS-300x113.png 300w, https://www.railscarma.com/wp-content/uploads/2020/07/MAKE-VOICE-CALLS-THROUGH-RUBY-ON-RAILS-WEB-APPLICATIONS-768x288.png 768w" sizes="(max-width: 800px) 100vw, 800px"/> </picture> </noscript> </a> </div> <a class="title post_title" href="https://www.railscarma.com/it/blog/technical-articles/effettuare-chiamate-vocali-tramite-le-applicazioni-web-ruby-on-rails/?related_post_from=31309"> Effettua chiamate vocali tramite le applicazioni Web Ruby on Rails </a> </div> <div class="item"> <div class="thumb post_thumb"> <a href="https://www.railscarma.com/it/blog/technical-articles/come-importare-esportare-il-database-mysql-in-rails/?related_post_from=31294"> <picture decoding="async" class="attachment-full size-full wp-post-image"> <source type="image/webp" data-lazy-srcset="https://www.railscarma.com/wp-content/uploads/2020/07/How-To-Import-or-Export-MySQL-Database-in-Rails.jpg.webp 744w, https://www.railscarma.com/wp-content/uploads/2020/07/How-To-Import-or-Export-MySQL-Database-in-Rails-300x113.jpg.webp 300w" srcset="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20744%20279'%3E%3C/svg%3E" data-lazy-sizes="(max-width: 744px) 100vw, 744px"/> <img decoding="async" width="744" height="279" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20744%20279'%3E%3C/svg%3E" alt="" data-lazy-srcset="https://www.railscarma.com/wp-content/uploads/2020/07/How-To-Import-or-Export-MySQL-Database-in-Rails.jpg 744w, https://www.railscarma.com/wp-content/uploads/2020/07/How-To-Import-or-Export-MySQL-Database-in-Rails-300x113.jpg 300w" data-lazy-sizes="(max-width: 744px) 100vw, 744px" data-lazy-src="https://www.railscarma.com/wp-content/uploads/2020/07/How-To-Import-or-Export-MySQL-Database-in-Rails.jpg"/> </picture> <noscript><picture loading="lazy" decoding="async" class="attachment-full size-full wp-post-image"> <source type="image/webp" srcset="https://www.railscarma.com/wp-content/uploads/2020/07/How-To-Import-or-Export-MySQL-Database-in-Rails.jpg.webp 744w, https://www.railscarma.com/wp-content/uploads/2020/07/How-To-Import-or-Export-MySQL-Database-in-Rails-300x113.jpg.webp 300w" sizes="(max-width: 744px) 100vw, 744px"/> <img loading="lazy" decoding="async" width="744" height="279" src="https://www.railscarma.com/wp-content/uploads/2020/07/How-To-Import-or-Export-MySQL-Database-in-Rails.jpg" alt="" srcset="https://www.railscarma.com/wp-content/uploads/2020/07/How-To-Import-or-Export-MySQL-Database-in-Rails.jpg 744w, https://www.railscarma.com/wp-content/uploads/2020/07/How-To-Import-or-Export-MySQL-Database-in-Rails-300x113.jpg 300w" sizes="(max-width: 744px) 100vw, 744px"/> </picture> </noscript> </a> </div> <a class="title post_title" href="https://www.railscarma.com/it/blog/technical-articles/come-importare-esportare-il-database-mysql-in-rails/?related_post_from=31294"> Come importare/esportare il database MySQL in Rails? </a> </div> </div> <script> </script> <style > .related-post{} .related-post .post-list{ text-align:left; } .related-post .post-list .item{ margin:10px; padding:10px; } .related-post .headline{ font-size:14px !important; color:#999999 !important; } .related-post .post-list .item .post_thumb{ max-height:220px; margin:10px 0px; padding:0px; display: block; } .related-post .post-list .item .post_title{ font-size:14px; color:#000000; margin:10px 0px; padding:0px; display: block; text-decoration: none; } .related-post .post-list .item .post_excerpt{ font-size:12px; color:#3f3f3f; margin:10px 0px; padding:0px; display: block; text-decoration: none; } .related-post .owl-dots .owl-dot { } </style> <script> jQuery(document).ready(function($){ $(".related-post .post-list").owlCarousel({ items :2, responsiveClass:true, responsive:{ 0:{ items:1, }, 768:{ items:2, }, 1200:{ items:2, } }, rewind: true, loop: true, center: false, autoplay: true, autoplayHoverPause: true, nav: true, navSpeed: 1000, navText : ['<i class="fas fa-chevron-left"></i>','<i class="fas fa-chevron-right"></i>'], dots: false, dotsSpeed: 1200, rtl: false, }); }); </script> </div> <div class="wp-post-author-wrap wp-post-author-shortcode left"> <h3 class="awpa-title">Informazioni sull'autore del post</h3> <div class="wp-post-author"> <div class="awpa-img awpa-author-block square"> <a href="https://www.railscarma.com/it/author/sales_jaqlr8na/"><img alt='' src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20150%20150'%3E%3C/svg%3E" data-lazy-srcset='https://secure.gravatar.com/avatar/6f0c15f10be4ef691ca9b9cd5acde243?s=300&d=mm&r=g 2x' class='avatar avatar-150 photo' height='150' width='150' data-lazy-src="https://secure.gravatar.com/avatar/6f0c15f10be4ef691ca9b9cd5acde243?s=150&d=mm&r=g" /><noscript><img alt='' src='https://secure.gravatar.com/avatar/6f0c15f10be4ef691ca9b9cd5acde243?s=150&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/6f0c15f10be4ef691ca9b9cd5acde243?s=300&d=mm&r=g 2x' class='avatar avatar-150 photo' height='150' width='150' /></noscript></a> </div> <div class="wp-post-author-meta awpa-author-block"> <h4 class="awpa-display-name"> <a href="https://www.railscarma.com/it/author/sales_jaqlr8na/">amministratore</a> </h4> <div class="wp-post-author-meta-bio"> </div> <div class="wp-post-author-meta-more-posts"> <p class="awpa-more-posts"> <a href="https://www.railscarma.com/it/author/sales_jaqlr8na/" class="awpa-more-posts" data-no-translation="" data-trp-gettext="">Vedi i post dell'autore</a> </p> </div> <ul class="awpa-contact-info"> <li class="awpa-website-li"> <a href="https://www.railscarma.com/it/assumere-ruby-on-rails-sviluppatore/" class="awpa-website awpa-icon-website"></a> </li> </ul> </div> </div> </div> </div><!-- .entry-content .clear --> </div> </article><!-- #post-## --> <nav class="navigation post-navigation" aria-label="Articoli" data-no-translation-aria-label=""> <h2 class="screen-reader-text" data-no-translation="" data-trp-gettext="">Navigazione articoli</h2> <div class="nav-links"><div class="nav-previous"><a href="https://www.railscarma.com/it/blog/technical-articles/impaginazione-in-rotaie-con-la-gemma-will_paginate/" rel="prev"><span class="ast-left-arrow">←</span> Precedente Articolo</a></div><div class="nav-next"><a href="https://www.railscarma.com/it/blog/technical-articles/protect-your-web-application-with-google-recaptcha-on-ruby-on-rails/" rel="next">Successivo Articolo <span class="ast-right-arrow">→</span></a></div></div> </nav> <div id="comments" class="comments-area"> <div id="respond" class="comment-respond"> <h3 id="reply-title" class="comment-reply-title">Lascia un commento <small><a rel="nofollow" id="cancel-comment-reply-link" href="/it/blog/technical-articles/imparare-i-fondamenti-della-gemma-nokogiri/#respond" style="display:none;" data-no-translation="" data-trp-gettext="">Cancella risposta</a></small></h3><form action="/wp-comments-post.php" method="post" id="ast-commentform" class="comment-form" data-trp-original-action="https://www.railscarma.com/wp-comments-post.php"><p class="comment-notes"><span id="email-notes" data-no-translation="" data-trp-gettext="">Il tuo indirizzo email non sarà pubblicato.</span> <span class="required-field-message" data-no-translation="" data-trp-gettext="">I campi obbligatori sono contrassegnati <span class="required">*</span></span></p><div class="ast-row comment-textarea"><fieldset class="comment-form-comment"><div class="comment-form-textarea ast-col-lg-12"><label for="comment" class="screen-reader-text" data-no-translation="" data-trp-gettext="">Digitare qui..</label><textarea id="comment" name="comment" placeholder="Digitare qui.." cols="45" rows="8" aria-required="true" data-no-translation-placeholder=""></textarea></div></fieldset></div><div class="ast-comment-formwrap ast-row"><p class="comment-form-author ast-col-xs-12 ast-col-sm-12 ast-col-md-4 ast-col-lg-4"><label for="author" class="screen-reader-text" data-no-translation="" data-trp-gettext="">Nome*</label><input id="author" name="author" type="text" value="" placeholder="Nome*" size="30" aria-required='true' data-no-translation-placeholder="" /></p> <p class="comment-form-email ast-col-xs-12 ast-col-sm-12 ast-col-md-4 ast-col-lg-4"><label for="email" class="screen-reader-text" data-no-translation="" data-trp-gettext="">E-mail*</label><input id="email" name="email" type="text" value="" placeholder="E-mail*" size="30" aria-required='true' data-no-translation-placeholder="" /></p> <p class="comment-form-url ast-col-xs-12 ast-col-sm-12 ast-col-md-4 ast-col-lg-4"><label for="url"><label for="url" class="screen-reader-text" data-no-translation="" data-trp-gettext="">Sito web</label><input id="url" name="url" type="text" value="" placeholder="Sito web" size="30" data-no-translation-placeholder="" /></label></p></div> <p class="comment-form-cookies-consent"><input id="wp-comment-cookies-consent" name="wp-comment-cookies-consent" type="checkbox" value="yes" /> <label for="wp-comment-cookies-consent" data-no-translation="" data-trp-gettext="">Salva il mio nome, email e sito web in questo browser per la prossima volta che commento.</label></p> <div class="anr_captcha_field"><div id="anr_captcha_field_1" class="anr_captcha_field_div"><input type="hidden" name="g-recaptcha-response" value="" /></div></div><p class="form-submit"><input name="submit" type="submit" id="submit" class="submit" value="Posta un commento "" data-no-translation-value="" /> <input type='hidden' name='comment_post_ID' value='7611' id='comment_post_ID' /> <input type='hidden' name='comment_parent' id='comment_parent' value='0' /> </p><input type="hidden" name="trp-form-language" value="it"/></form> </div><!-- #respond --> </div><!-- #comments --> </main><!-- #main --> </div><!-- #primary --> <div class="widget-area secondary" id="secondary" role="complementary" itemtype="https://schema.org/WPSideBar" itemscope="itemscope"> <div class="sidebar-main" > <aside id="sib_subscribe_form-2" class="widget widget_sib_subscribe_form"><h2 class="widget-title">Iscriviti per ricevere aggiornamenti</h2> <script type="text/javascript"> var gCaptchaSibWidget; var onloadSibCallback = function() { var element = document.getElementsByClassName('sib-default-btn'); gCaptchaSibWidget = grecaptcha.render(element[0],{ 'sitekey' : '6LdikOAaAAAAAJ6SWrrKVQrtw7TQpQAEnv0HS0G3', 'callback' : sibVerifyCallback }); }; </script> <script src="https://www.google.com/recaptcha/api.js?onload=onloadSibCallback&render=explicit" async defer></script> <form id="sib_signup_form_1" method="post" class="sib_signup_form"> <div class="sib_loader" style="display:none;"><img width="20" height="20" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2020%2020'%3E%3C/svg%3E" alt="caricatore" data-lazy-src="https://www.railscarma.com/wp-includes/images/spinner.gif"><noscript><img width="20" height="20" src="https://www.railscarma.com/wp-includes/images/spinner.gif" alt="caricatore"></noscript></div> <input type="hidden" name="sib_form_action" value="subscribe_form_submit"> <input type="hidden" name="sib_form_id" value="1"> <input type="hidden" name="sib_form_alert_notice" value="Please fill out this field"> <input type="hidden" name="sib_security" value="60c52b891c"> <div class="sib_signup_box_inside_1"> <div style="/*display:none*/" class="sib_msg_disp"> </div> <p class="sib-email-area"> <label class="sib-email-area"></label> <input type="email" class="sib-email-area" name="email" required="required" placeholder="Indirizzo e-mail"> </p> <p class="sib-NAME-area"> <label class="sib-NAME-area"></label> <input type="text" class="sib-NAME-area" name="NAME" placeholder="Nome" > </p> <p> <input type="submit" class="sib-default-btn" value="sottoscrivi"> </p> </div> <input type="hidden" name="trp-form-language" value="it"/></form> <style> form#sib_signup_form_1 p.sib-alert-message { padding: 6px 12px; margin-bottom: 20px; border: 1px solid transparent; border-radius: 4px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } form#sib_signup_form_1 p.sib-alert-message-error { background-color: #f2dede; border-color: #ebccd1; color: #a94442; } form#sib_signup_form_1 p.sib-alert-message-success { background-color: #dff0d8; border-color: #d6e9c6; color: #3c763d; } form#sib_signup_form_1 p.sib-alert-message-warning { background-color: #fcf8e3; border-color: #faebcc; color: #8a6d3b; } </style> </aside> <aside id="recent-posts-2" class="widget widget_recent_entries"> <h2 class="widget-title" data-no-translation="" data-trp-gettext="">Articoli recenti</h2><nav aria-label="Articoli recenti" data-no-translation-aria-label=""> <ul> <li> <a href="https://www.railscarma.com/it/blog/understanding-rubys-sort_by-method-a-beginners-guide/">Understanding Ruby’s sort_by Method: A Beginner’s Guide</a> </li> <li> <a href="https://www.railscarma.com/it/blog/top-10-machine-learning-algorithms-to-know/">Top 10 Machine Learning Algorithms to Know in 2025</a> </li> <li> <a href="https://www.railscarma.com/it/blog/top-10-most-popular-backend-frameworks/">Top 10 Most Popular Backend Frameworks in 2025</a> </li> </ul> </nav></aside><aside id="categories-2" class="widget widget_categories"><h2 class="widget-title" data-no-translation="" data-trp-gettext="">Categorie</h2><nav aria-label="Categorie" data-no-translation-aria-label=""> <ul> <li class="cat-item cat-item-385"><a href="https://www.railscarma.com/it/categoria/blog/management/">Articoli sulla gestione</a> </li> <li class="cat-item cat-item-1224"><a href="https://www.railscarma.com/it/categoria/blog/">Blog</a> </li> <li class="cat-item cat-item-596"><a href="https://www.railscarma.com/it/categoria/blog/hybrid-app/">applicazione ibrida</a> </li> <li class="cat-item cat-item-517"><a href="https://www.railscarma.com/it/categoria/blog/industry-insights/">Approfondimenti sul settore</a> </li> <li class="cat-item cat-item-697"><a href="https://www.railscarma.com/it/categoria/lavori/">lavori</a> </li> <li class="cat-item cat-item-598"><a href="https://www.railscarma.com/it/categoria/blog/mobile-app/">Applicazione mobile</a> </li> <li class="cat-item cat-item-600"><a href="https://www.railscarma.com/it/categoria/blog/mobile-application-development/">sviluppo di applicazioni mobili</a> </li> <li class="cat-item cat-item-601"><a href="https://www.railscarma.com/it/categoria/blog/mobile-marketing/">marketing mobile</a> </li> <li class="cat-item cat-item-602"><a href="https://www.railscarma.com/it/categoria/blog/native-app/">applicazione nativa</a> </li> <li class="cat-item cat-item-414"><a href="https://www.railscarma.com/it/categoria/blog/news/">Notizia</a> </li> <li class="cat-item cat-item-455"><a href="https://www.railscarma.com/it/categoria/blog/rails-3/">Rotaie 3</a> </li> <li class="cat-item cat-item-690"><a href="https://www.railscarma.com/it/categoria/blog/ror/">ROR</a> </li> <li class="cat-item cat-item-384"><a href="https://www.railscarma.com/it/categoria/blog/technical-articles/">Articoli tecnici</a> </li> <li class="cat-item cat-item-1"><a href="https://www.railscarma.com/it/categoria/blog/uncategorized/">Non categorizzato</a> </li> <li class="cat-item cat-item-606"><a href="https://www.railscarma.com/it/categoria/blog/web-app-railscarma/">applicazione web</a> </li> </ul> </nav></aside><aside id="media_image-2" class="widget widget_media_image"><h2 class="widget-title">Chi siamo</h2><img width="200" height="46" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20200%2046'%3E%3C/svg%3E" class="image wp-image-16 attachment-full size-full" alt="RailsCarma - Società di sviluppo Ruby on Rails specializzata nello sviluppo offshore" style="max-width: 100%; height: auto;" decoding="async" data-lazy-src="https://www.railscarma.com/wp-content/uploads/2020/08/railscarma_logo.png" /><noscript><img width="200" height="46" src="https://www.railscarma.com/wp-content/uploads/2020/08/railscarma_logo.png" class="image wp-image-16 attachment-full size-full" alt="RailsCarma - Società di sviluppo Ruby on Rails specializzata nello sviluppo offshore" style="max-width: 100%; height: auto;" decoding="async" /></noscript></aside><aside id="text-8" class="widget widget_text"> <div class="textwidget"><p>RailsCarma, una delle aziende tecnologiche in più rapida crescita, è specializzata nella creazione di soluzioni per imprenditori, grandi organizzazioni, agenzie e start-up.</p> <p><a href="https://www.railscarma.com/it/">Per saperne di più</a></p> </div> </aside> </div><!-- .sidebar-main --> </div><!-- #secondary --> </div> <!-- ast-container --> </div><!-- #content --> <footer class="site-footer" id="colophon" itemtype="https://schema.org/WPFooter" itemscope="itemscope" itemid="#colophon" > <div class="footer-adv footer-adv-layout-4"> <div class="footer-adv-overlay"> <div class="ast-container"> <div class="ast-row"> <div class="ast-col-lg-3 ast-col-md-3 ast-col-sm-12 ast-col-xs-12 footer-adv-widget footer-adv-widget-1" > <div id="text-3" class="widget widget_text"><h2 class="widget-title">Navigazione rapida</h2> <div class="textwidget"><p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/it/chi-siamo/">Chi siamo</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/it/why-us/">Perché noi</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/it/our-team/">La nostra squadra</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/it/careers/">Carriere</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/it/our-development-workflow/">Flusso di lavoro di sviluppo</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/it/technology-stack/">Pila tecnologica</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/it/agile-rails-methodology/">Metodologia di sviluppo agile</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/it/portafoglio/">Portafoglio</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/it/casestudies/">Casi studio</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/it/blog/">Blog</a></p> </div> </div> </div> <div class="ast-col-lg-3 ast-col-md-3 ast-col-sm-12 ast-col-xs-12 footer-adv-widget footer-adv-widget-2" > <div id="text-4" class="widget widget_text"><h2 class="widget-title">I nostri servizi</h2> <div class="textwidget"><p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/it/ruby-on-rails-consulting/">Consulenza Ruby On Rails</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/it/sviluppo-di-applicazioni-mobili/">Sviluppo di app mobili</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/it/assumere-ruby-on-rails-sviluppatore/">Assumi uno sviluppatore Ruby on Rails</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/it/product-development-services/">Servizi di sviluppo prodotto</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/it/sviluppo-commerciale-spree/">Sviluppo del commercio sfrenato</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/it/saas-application-development/">Sviluppo di applicazioni SaaS</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/it/sviluppo-di-applicazioni-per-binari-personalizzati/">Sviluppo di applicazioni ROR</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/it/mvp-development/">Sviluppo MVP</a></p> </div> </div> </div> <div class="ast-col-lg-3 ast-col-md-3 ast-col-sm-12 ast-col-xs-12 footer-adv-widget footer-adv-widget-3" > <div id="text-9" class="widget widget_text"> <div class="textwidget"><h2 style="margin-bottom: 60px;"></h2> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/it/devops-services/">Servizio DevOps</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/it/cloud-hosting-and-migration/">Hosting e migrazione nel cloud</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/it/api-driven-development-and-mashups/">Sviluppo basato su API</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/it/rails-upgrade-service-provider/">Servizio di aggiornamento delle rotaie</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/it/application-support-and-maintenance/">Supporto e manutenzione dell'app</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/it/societa-di-sviluppo-mean-stack/">Sviluppo dello stack MEAN</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/it/societa-di-servizi-di-progettazione-ui-ux/">Servizi di progettazione UI UX</a></p> <p><a href="https://www.railscarma.com/it/servizi-di-sviluppo-mern-stack/">Sviluppo dello stack MERN</a></p> </div> </div> </div> <div class="ast-col-lg-3 ast-col-md-3 ast-col-sm-12 ast-col-xs-12 footer-adv-widget footer-adv-widget-4" > <div id="text-6" class="widget widget_text"><h2 class="widget-title">Informazioni di contatto</h2> <div class="textwidget"><p style="margin-bottom: 1.1em;"><i class="fa fa-angle-double-right" style="color: #b71c1c; font-size: 16px; margin-right: 10px;" aria-hidden="true"></i>sales@railscarma.com</p> <p style="margin-bottom: 1.1em;"><i class="fa fa-angle-double-right" style="color: #b71c1c; font-size: 16px; margin-right: 10px;" aria-hidden="true"></i>+1 (888) 394 0048 (Stati Uniti)</p> <p style="margin-bottom: 1.1em;"><i class="fa fa-angle-double-right" style="color: #b71c1c; font-size: 16px; margin-right: 10px;" aria-hidden="true"></i>+91 70120 98783 (IND)</p> </div> </div><div id="custom_html-2" class="widget_text widget widget_custom_html"><div class="textwidget custom-html-widget"><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"> <a href="https://www.facebook.com/RailsCarma"><i class="fa fa-facebook-square" style="font-size:26px;color:#b71c1c;padding-right:10px"></i></a><a href="https://twitter.com/railscarma"><i class="fa fa-twitter-square" style="font-size:26px;color:#b71c1c;padding-right:10px;"></i></a><a href="https://www.linkedin.com/company/railscarma/"><i class="fa fa-linkedin-square" style="font-size:26px;color:#b71c1c;padding-right:10px;"></i></a><a href="https://www.behance.net/railscarma"><i class="fa fa-behance-square" style="font-size:26px;color:#b71c1c;padding-right:10px;"></i></a><a href="https://dribbble.com/railscarma"><i class="fa fa-dribbble" style="font-size:26px;color:#b71c1c;"></i></a> <a href="https://www.provenexpert.com/railscarma-ruby-on-rails-development-company/"><i class="fa fa-check-square" style="font-size:26px;color:#b71c1c;margin-left:10px;"></i></a> <a href="https://clutch.co/profile/railscarma#summary"><picture style="height: 25px; margin-top: -10px; margin-left: 10px;"> <source type="image/webp" data-lazy-srcset="https://www.railscarma.com/wp-content/uploads/2021/11/clutch.png.webp" srcset="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2026%2026'%3E%3C/svg%3E"/> <img width="26" height="26" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2026%2026'%3E%3C/svg%3E" alt="" data-lazy-src="https://www.railscarma.com/wp-content/uploads/2021/11/clutch.png"/> </picture> <noscript><picture style="height: 25px; margin-top: -10px; margin-left: 10px;"> <source type="image/webp" srcset="https://www.railscarma.com/wp-content/uploads/2021/11/clutch.png.webp"/> <img width="26" height="26" src="https://www.railscarma.com/wp-content/uploads/2021/11/clutch.png" alt=""/> </picture> </noscript></a> <a href="https://upcity.com/profiles/railscarma"><picture style="height: 25px; margin-top: -10px;"> <source type="image/webp" data-lazy-srcset="https://www.railscarma.com/wp-content/uploads/2021/11/upcity.png.webp" srcset="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2026%2026'%3E%3C/svg%3E"/> <img width="26" height="26" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2026%2026'%3E%3C/svg%3E" alt="" data-lazy-src="https://www.railscarma.com/wp-content/uploads/2021/11/upcity.png"/> </picture> <noscript><picture style="height: 25px; margin-top: -10px;"> <source type="image/webp" srcset="https://www.railscarma.com/wp-content/uploads/2021/11/upcity.png.webp"/> <img width="26" height="26" src="https://www.railscarma.com/wp-content/uploads/2021/11/upcity.png" alt=""/> </picture> </noscript></a></div></div><div id="custom_html-3" class="widget_text widget widget_custom_html"><div class="textwidget custom-html-widget"><link href="https://cdn.sur.ly/widget-awards/css/diamond.min.css?d20210507" rel="stylesheet"> <div style="width:230px ! important;" class="surly__diamond surly__black surly__id_40525429" onclick="if(event.target.nodeName.toLowerCase() != 'a' && event.target.parentElement.nodeName.toLowerCase() != 'a') {window.open('https://sur.ly/i/railscarma.com/'); return 0;}"> <div class="surly__logo-container"> <a href="https://sur.ly" class="surly__name"><span class="surly__name-prefix">di</span> <span>sur.ly</span></a> </div> <div class="surly__content"> <span style="font-size:12px ! important;" class="surly__title surly__title_r3"> <span class="surly__subtitle">100% Rispettabile</span> <span class="surly__subtitle">Sviluppo </span> <span class="surly__subtitle">Azienda</span> </span> <span class="surly__text" style="font-size:12px ! important;">Sito web</span> <span class="surly__date" style="font-size:14px ! important;">2021</span> </div> </div></div></div> </div> </div><!-- .ast-row --> <div class="footlocations"> <div class="tooltip"><picture class="alignnone size-full wp-image-33204" style="margin-right: 10px;"> <source type="image/webp" data-lazy-srcset="https://www.railscarma.com/wp-content/uploads/2021/09/DXB.png.webp" srcset="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2030%2020'%3E%3C/svg%3E"/> <img src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2030%2020'%3E%3C/svg%3E" alt="" width="30" height="20" data-lazy-src="https://www.railscarma.com/wp-content/uploads/2021/09/DXB.png"/> </picture> <noscript><picture class="alignnone size-full wp-image-33204" style="margin-right: 10px;"> <source type="image/webp" srcset="https://www.railscarma.com/wp-content/uploads/2021/09/DXB.png.webp"/> <img src="https://www.railscarma.com/wp-content/uploads/2021/09/DXB.png" alt="" width="30" height="20"/> </picture> </noscript><a href="https://www.railscarma.com/it/ruby-on-rails-development-company-a-dubai-emirati-arabi-uniti/"> Dubai, Emirati Arabi Uniti</a><span class="tooltiptext">Casella postale 390 667, Business Center, Dubai World Central, Dubai</span></div>   <div class="tooltip"><picture class="alignnone size-full wp-image-802" style="margin-right: 10px;"> <source type="image/webp" data-lazy-srcset="https://www.railscarma.com/wp-content/uploads/2021/09/usa.jpg.webp" srcset="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2030%2020'%3E%3C/svg%3E"/> <img src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2030%2020'%3E%3C/svg%3E" alt="" width="30" height="20" data-lazy-src="https://www.railscarma.com/wp-content/uploads/2021/09/usa.jpg"/> </picture> <noscript><picture class="alignnone size-full wp-image-802" style="margin-right: 10px;"> <source type="image/webp" srcset="https://www.railscarma.com/wp-content/uploads/2021/09/usa.jpg.webp"/> <img src="https://www.railscarma.com/wp-content/uploads/2021/09/usa.jpg" alt="" width="30" height="20"/> </picture> </noscript><a href="https://www.railscarma.com/it/ruby-rails-development-consulting-california/">California, Stati Uniti</a><span class="tooltiptext">515 S, Flower Street 36° piano, Los Angeles, California, 90071</span></div>   <div class="tooltip"><picture class="alignnone size-full wp-image-802" style="margin-right: 10px;"> <source type="image/webp" data-lazy-srcset="https://www.railscarma.com/wp-content/uploads/2021/09/usa.jpg.webp" srcset="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2030%2020'%3E%3C/svg%3E"/> <img src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2030%2020'%3E%3C/svg%3E" alt="" width="30" height="20" data-lazy-src="https://www.railscarma.com/wp-content/uploads/2021/09/usa.jpg"/> </picture> <noscript><picture class="alignnone size-full wp-image-802" style="margin-right: 10px;"> <source type="image/webp" srcset="https://www.railscarma.com/wp-content/uploads/2021/09/usa.jpg.webp"/> <img src="https://www.railscarma.com/wp-content/uploads/2021/09/usa.jpg" alt="" width="30" height="20"/> </picture> </noscript><a href="https://www.railscarma.com/it/ruby-on-rails-development-consulting-new-york/">New York, Stati Uniti</a><span class="tooltiptext">172 5th Ave Suite 49 Brooklyn, New York 11217, Stati Uniti</span></div>   <div class="tooltip"><picture class="alignnone size-full wp-image-802" style="margin-right: 10px;"> <source type="image/webp" data-lazy-srcset="https://www.railscarma.com/wp-content/uploads/2021/09/usa.jpg.webp" srcset="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2030%2020'%3E%3C/svg%3E"/> <img src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2030%2020'%3E%3C/svg%3E" alt="" width="30" height="20" data-lazy-src="https://www.railscarma.com/wp-content/uploads/2021/09/usa.jpg"/> </picture> <noscript><picture class="alignnone size-full wp-image-802" style="margin-right: 10px;"> <source type="image/webp" srcset="https://www.railscarma.com/wp-content/uploads/2021/09/usa.jpg.webp"/> <img src="https://www.railscarma.com/wp-content/uploads/2021/09/usa.jpg" alt="" width="30" height="20"/> </picture> </noscript><a href="https://www.railscarma.com/it/ruby-on-rails-development-consulting-dallas/">Dalla, Stati Uniti</a><span class="tooltiptext">3333 Lee Parkway, Ste 600, Dallas, TX 75219 Stati Uniti</span></div>   <div class="tooltip"><picture class="alignnone size-full wp-image-801" style="margin-right: 10px;"> <source type="image/webp" data-lazy-srcset="https://www.railscarma.com/wp-content/uploads/2021/09/qatar.jpg.webp" srcset="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2030%2020'%3E%3C/svg%3E"/> <img src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2030%2020'%3E%3C/svg%3E" alt="" width="30" height="20" data-lazy-src="https://www.railscarma.com/wp-content/uploads/2021/09/qatar.jpg"/> </picture> <noscript><picture class="alignnone size-full wp-image-801" style="margin-right: 10px;"> <source type="image/webp" srcset="https://www.railscarma.com/wp-content/uploads/2021/09/qatar.jpg.webp"/> <img src="https://www.railscarma.com/wp-content/uploads/2021/09/qatar.jpg" alt="" width="30" height="20"/> </picture> </noscript><a href="https://www.railscarma.com/it/consulenza-per-lo-sviluppo-di-ruby-rails-a-doha-qatar/">Doha, Qatar</a><span class="tooltiptext">Torre Al EZZ, 2° piano, edificio n. 84, Al Aaliya Street, Doha-Qatar</span></div>   <div class="tooltip"><picture class="alignnone size-full wp-image-803" style="margin-right: 10px;"> <source type="image/webp" data-lazy-srcset="https://www.railscarma.com/wp-content/uploads/2021/09/india.jpg.webp" srcset="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2030%2020'%3E%3C/svg%3E"/> <img src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2030%2020'%3E%3C/svg%3E" alt="" width="30" height="20" data-lazy-src="https://www.railscarma.com/wp-content/uploads/2021/09/india.jpg"/> </picture> <noscript><picture class="alignnone size-full wp-image-803" style="margin-right: 10px;"> <source type="image/webp" srcset="https://www.railscarma.com/wp-content/uploads/2021/09/india.jpg.webp"/> <img src="https://www.railscarma.com/wp-content/uploads/2021/09/india.jpg" alt="" width="30" height="20"/> </picture> </noscript><a href="https://www.railscarma.com/it/ruby-on-rails-development-consulting-in-bangalore/">Bangalore, India</a><span class="tooltiptext">#27, Ambalipura, Bellandur, Bangalore 560103, India.</span></div> </div> </div><!-- .ast-container --> </div><!-- .footer-adv-overlay--> </div><!-- .ast-theme-footer .footer-adv-layout-4 --> <div class="ast-small-footer footer-sml-layout-1"> <div class="ast-footer-overlay"> <div class="ast-container"> <div class="ast-small-footer-wrap" > <div class="ast-small-footer-section ast-small-footer-section-1" > Copyright © 2024 - 2025 <a href="https://www.railscarma.com/it/" title="Società di sviluppo Ruby On Rails">RailsCarma.</a> Tutti i diritti riservati. Progettato da <a class="" href="https://www.carmatec.com/">Carmatec</a> </div> <div class="ast-small-footer-section ast-small-footer-section-2" > <a href="https://www.railscarma.com/it/privacy-policy/">Politica sulla riservatezza. </a><a href="https://www.railscarma.com/it/termini-di-utilizzo/">Termini di utilizzo.</a><a href="https://www.railscarma.com/it/mappa-del-sito/"> Mappa del sito</a> </div> </div><!-- .ast-row .ast-small-footer-wrap --> </div><!-- .ast-container --> </div><!-- .ast-footer-overlay --> </div><!-- .ast-small-footer--> </footer><!-- #colophon --> </div><!-- #page --> <template id="tp-language" data-tp-language="it_IT"></template><!--googleoff: all--><div id="cookie-law-info-bar" data-nosnippet="true"><span data-no-translation="" data-trp-gettext=""><div class="cli-bar-container cli-style-v2"><div class="cli-bar-message">Utilizziamo i cookie sul nostro sito Web per offrirti l'esperienza più pertinente ricordando le tue preferenze e ripetendo le visite. Cliccando su "ACCETTA TUTTI" acconsenti all'uso di TUTTI i cookie. Tuttavia, puoi visitare "Impostazioni cookie" per fornire un consenso controllato.</div><div class="cli-bar-btn_container"> <a role='button' class="cli_settings_button" style="margin:0px 10px 0px 5px">Impostazioni cookie</a> <a role='button' id="cookie_action_close_header_reject" class="medium cli-plugin-button cli-plugin-main-button cookie_action_close_header_reject cli_action_button" data-cli_action="reject" style="margin:5px 10px 5px 5px">RIFIUTARE TUTTO</a> <a id="wt-cli-accept-all-btn" role='button' data-cli_action="accept_all" class="wt-cli-element medium cli-plugin-button wt-cli-accept-all-btn cookie_action_close_header cli_action_button">ACCEPT ALL</a></div></div></span></div><div id="cookie-law-info-again" style="display:none;" data-nosnippet="true"><span id="cookie_hdr_showagain" data-no-translation="" data-trp-gettext="">Gestisci il consenso</span></div><div class="cli-modal" data-nosnippet="true" id="cliSettingsPopup" tabindex="-1" role="dialog" aria-labelledby="cliSettingsPopup" aria-hidden="true"> <div class="cli-modal-dialog" role="document"> <div class="cli-modal-content cli-bar-popup"> <button type="button" class="cli-modal-close" id="cliModalClose"> <svg class="" viewbox="0 0 24 24"><path d="M19 6.41l-1.41-1.41-5.59 5.59-5.59-5.59-1.41 1.41 5.59 5.59-5.59 5.59 1.41 1.41 5.59-5.59 5.59 5.59 1.41-1.41-5.59-5.59z"></path><path d="M0 0h24v24h-24z" fill="none"></path></svg> <span class="wt-cli-sr-only" data-no-translation="" data-trp-gettext="">Vicino</span> </button> <div class="cli-modal-body"> <div class="cli-container-fluid cli-tab-container"> <div class="cli-row"> <div class="cli-col-12 cli-align-items-stretch cli-px-0"> <div class="cli-privacy-overview"> <h4>Panoramica sulla privacy</h4> <div class="cli-privacy-content"> <div class="cli-privacy-content-text">Questo sito Web utilizza i cookie per migliorare la tua esperienza durante la navigazione nel sito Web. Di questi, i cookie classificati come necessari vengono memorizzati nel tuo browser in quanto sono essenziali per il funzionamento delle funzionalità di base del sito web. Utilizziamo anche cookie di terze parti che ci aiutano ad analizzare e comprendere come utilizzi questo sito web. Questi cookie verranno memorizzati nel tuo browser solo con il tuo consenso. Hai anche la possibilità di disattivare questi cookie. Ma la disattivazione di alcuni di questi cookie potrebbe influire sulla tua esperienza di navigazione.</div> </div> <a class="cli-privacy-readmore" aria-label="Mostra di più" tabindex="0" role="button" data-readmore-text="Mostra di più" data-readless-text="Mostra meno" data-no-translation-aria-label="" data-no-translation-data-readmore-text="" data-no-translation-data-readless-text=""></a> </div> </div> <div class="cli-col-12 cli-align-items-stretch cli-px-0 cli-tab-section-container"> <div class="cli-tab-section"> <div class="cli-tab-header"> <a role="button" tabindex="0" class="cli-nav-link cli-settings-mobile" data-target="necessary" data-toggle="cli-toggle-tab"> Necessario </a> <div class="wt-cli-necessary-checkbox"> <input type="checkbox" class="cli-user-preference-checkbox" id="wt-cli-checkbox-necessary" data-id="checkbox-necessary" checked="checked" /> <label class="form-check-label" for="wt-cli-checkbox-necessary">Necessario</label> </div> <span class="cli-necessary-caption" data-no-translation="" data-trp-gettext="">Sempre abilitato</span> </div> <div class="cli-tab-content"> <div class="cli-tab-pane cli-fade" data-id="necessary"> <p>I cookie necessari sono assolutamente essenziali affinché il sito web funzioni correttamente. Questi cookie garantiscono le funzionalità di base e le caratteristiche di sicurezza del sito web, in modo anonimo. <table class="cookielawinfo-row-cat-table cookielawinfo-winter"><thead><tr><th class="cookielawinfo-column-1" data-no-translation="" data-trp-gettext="">Biscotto</th><th class="cookielawinfo-column-3" data-no-translation="" data-trp-gettext="">Durata</th><th class="cookielawinfo-column-4" data-no-translation="" data-trp-gettext="">Descrizione</th></tr></thead><tbody><tr class="cookielawinfo-row"><td class="cookielawinfo-column-1">cookielawinfo-checkbox-analytics</td><td class="cookielawinfo-column-3">11 mesi</td><td class="cookielawinfo-column-4">Questo cookie è impostato dal plug-in GDPR Cookie Consent. Il cookie viene utilizzato per memorizzare il consenso dell'utente per i cookie nella categoria "Analytics".</td></tr><tr class="cookielawinfo-row"><td class="cookielawinfo-column-1">cookielawinfo-checkbox-funzionale</td><td class="cookielawinfo-column-3">11 mesi</td><td class="cookielawinfo-column-4">Il cookie è impostato dal consenso cookie GDPR per registrare il consenso dell'utente per i cookie nella categoria "Funzionali".</td></tr><tr class="cookielawinfo-row"><td class="cookielawinfo-column-1">cookielawinfo-checkbox-necessario</td><td class="cookielawinfo-column-3">11 mesi</td><td class="cookielawinfo-column-4">Questo cookie è impostato dal plug-in GDPR Cookie Consent. I cookie vengono utilizzati per memorizzare il consenso dell'utente per i cookie nella categoria "Necessari".</td></tr><tr class="cookielawinfo-row"><td class="cookielawinfo-column-1">cookielawinfo-checkbox-altri</td><td class="cookielawinfo-column-3">11 mesi</td><td class="cookielawinfo-column-4">Questo cookie è impostato dal plug-in GDPR Cookie Consent. Il cookie viene utilizzato per memorizzare il consenso dell'utente per i cookie nella categoria "Altro.</td></tr><tr class="cookielawinfo-row"><td class="cookielawinfo-column-1">cookielawinfo-checkbox-performance</td><td class="cookielawinfo-column-3">11 mesi</td><td class="cookielawinfo-column-4">Questo cookie è impostato dal plug-in GDPR Cookie Consent. Il cookie viene utilizzato per memorizzare il consenso dell'utente per i cookie nella categoria "Prestazioni".</td></tr><tr class="cookielawinfo-row"><td class="cookielawinfo-column-1">visti_cookie_policy</td><td class="cookielawinfo-column-3">11 mesi</td><td class="cookielawinfo-column-4">Il cookie viene impostato dal plug-in GDPR Cookie Consent e viene utilizzato per memorizzare se l'utente ha acconsentito o meno all'uso dei cookie. Non memorizza alcun dato personale.</td></tr></tbody></table></p> </div> </div> </div> <div class="cli-tab-section"> <div class="cli-tab-header"> <a role="button" tabindex="0" class="cli-nav-link cli-settings-mobile" data-target="functional" data-toggle="cli-toggle-tab"> Funzionale </a> <div class="cli-switch"> <input type="checkbox" id="wt-cli-checkbox-functional" class="cli-user-preference-checkbox" data-id="checkbox-functional" /> <label for="wt-cli-checkbox-functional" class="cli-slider" data-cli-enable="Abilitato" data-cli-disable="Disabilitato" data-no-translation-data-cli-enable="" data-no-translation-data-cli-disable=""><span class="wt-cli-sr-only">Funzionale</span></label> </div> </div> <div class="cli-tab-content"> <div class="cli-tab-pane cli-fade" data-id="functional"> <p>I cookie funzionali aiutano a eseguire determinate funzionalità come la condivisione del contenuto del sito Web su piattaforme di social media, la raccolta di feedback e altre funzionalità di terze parti. </p> </div> </div> </div> <div class="cli-tab-section"> <div class="cli-tab-header"> <a role="button" tabindex="0" class="cli-nav-link cli-settings-mobile" data-target="performance" data-toggle="cli-toggle-tab"> Prestazione </a> <div class="cli-switch"> <input type="checkbox" id="wt-cli-checkbox-performance" class="cli-user-preference-checkbox" data-id="checkbox-performance" /> <label for="wt-cli-checkbox-performance" class="cli-slider" data-cli-enable="Abilitato" data-cli-disable="Disabilitato" data-no-translation-data-cli-enable="" data-no-translation-data-cli-disable=""><span class="wt-cli-sr-only">Prestazione</span></label> </div> </div> <div class="cli-tab-content"> <div class="cli-tab-pane cli-fade" data-id="performance"> <p>I cookie per le prestazioni vengono utilizzati per comprendere e analizzare gli indici di prestazione chiave del sito Web che aiutano a offrire ai visitatori un'esperienza utente migliore. </p> </div> </div> </div> <div class="cli-tab-section"> <div class="cli-tab-header"> <a role="button" tabindex="0" class="cli-nav-link cli-settings-mobile" data-target="analytics" data-toggle="cli-toggle-tab"> Analitica </a> <div class="cli-switch"> <input type="checkbox" id="wt-cli-checkbox-analytics" class="cli-user-preference-checkbox" data-id="checkbox-analytics" /> <label for="wt-cli-checkbox-analytics" class="cli-slider" data-cli-enable="Abilitato" data-cli-disable="Disabilitato" data-no-translation-data-cli-enable="" data-no-translation-data-cli-disable=""><span class="wt-cli-sr-only">Analitica</span></label> </div> </div> <div class="cli-tab-content"> <div class="cli-tab-pane cli-fade" data-id="analytics"> <p>I cookie analitici vengono utilizzati per capire come i visitatori interagiscono con il sito web. Questi cookie aiutano a fornire informazioni sulle metriche relative al numero di visitatori, frequenza di rimbalzo, fonte di traffico, ecc. </p> </div> </div> </div> <div class="cli-tab-section"> <div class="cli-tab-header"> <a role="button" tabindex="0" class="cli-nav-link cli-settings-mobile" data-target="advertisement" data-toggle="cli-toggle-tab"> Annuncio </a> <div class="cli-switch"> <input type="checkbox" id="wt-cli-checkbox-advertisement" class="cli-user-preference-checkbox" data-id="checkbox-advertisement" /> <label for="wt-cli-checkbox-advertisement" class="cli-slider" data-cli-enable="Abilitato" data-cli-disable="Disabilitato" data-no-translation-data-cli-enable="" data-no-translation-data-cli-disable=""><span class="wt-cli-sr-only">Annuncio</span></label> </div> </div> <div class="cli-tab-content"> <div class="cli-tab-pane cli-fade" data-id="advertisement"> <p>I cookie pubblicitari vengono utilizzati per fornire ai visitatori annunci e campagne di marketing pertinenti. Questi cookie tracciano i visitatori attraverso i siti Web e raccolgono informazioni per fornire annunci personalizzati. </p> </div> </div> </div> <div class="cli-tab-section"> <div class="cli-tab-header"> <a role="button" tabindex="0" class="cli-nav-link cli-settings-mobile" data-target="others" data-toggle="cli-toggle-tab"> Altri </a> <div class="cli-switch"> <input type="checkbox" id="wt-cli-checkbox-others" class="cli-user-preference-checkbox" data-id="checkbox-others" /> <label for="wt-cli-checkbox-others" class="cli-slider" data-cli-enable="Abilitato" data-cli-disable="Disabilitato" data-no-translation-data-cli-enable="" data-no-translation-data-cli-disable=""><span class="wt-cli-sr-only">Altri</span></label> </div> </div> <div class="cli-tab-content"> <div class="cli-tab-pane cli-fade" data-id="others"> <p>Altri cookie senza categoria sono quelli che vengono analizzati e non sono stati ancora classificati in una categoria. </p> </div> </div> </div> </div> </div> </div> </div> <div class="cli-modal-footer"> <div class="wt-cli-element cli-container-fluid cli-tab-container"> <div class="cli-row"> <div class="cli-col-12 cli-align-items-stretch cli-px-0"> <div class="cli-tab-footer wt-cli-privacy-overview-actions"> <a id="wt-cli-privacy-save-btn" role="button" tabindex="0" data-cli-action="accept" class="wt-cli-privacy-btn cli_setting_save_button wt-cli-privacy-accept-btn cli-btn" data-no-translation="" data-trp-gettext="">SALVA E ACCETTA</a> </div> </div> </div> </div> </div> </div> </div> </div> <div class="cli-modal-backdrop cli-fade cli-settings-overlay"></div> <div class="cli-modal-backdrop cli-fade cli-popupbar-overlay"></div> <!--googleon: all--> <!--Start of Tawk.to Script (0.8.6)--> <script id="tawk-script" type="text/javascript"> var Tawk_API = Tawk_API || {}; var Tawk_LoadStart=new Date(); (function(){ var s1 = document.createElement( 'script' ),s0=document.getElementsByTagName( 'script' )[0]; s1.async = true; s1.src = 'https://embed.tawk.to/624d2fb9c72df874911d3773/1fvuo4t5p'; s1.charset = 'UTF-8'; s1.setAttribute( 'crossorigin','*' ); s0.parentNode.insertBefore( s1, s0 ); })(); </script> <!--End of Tawk.to Script (0.8.6)--> <div id="trp-floater-ls" onclick="" data-no-translation class="trp-language-switcher-container trp-floater-ls-names trp-bottom-left trp-color-dark flags-full-names" > <div id="trp-floater-ls-current-language" class="trp-with-flags"> <a href="#" class="trp-floater-ls-disabled-language trp-ls-disabled-language" onclick="event.preventDefault()"> <img class="trp-flag-image" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2018%2012'%3E%3C/svg%3E" width="18" height="12" alt="it_IT" title="Italian" data-lazy-src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/it_IT.png"><noscript><img class="trp-flag-image" src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/it_IT.png" width="18" height="12" alt="it_IT" title="Italian"></noscript>Italian </a> </div> <div id="trp-floater-ls-language-list" class="trp-with-flags" > <div class="trp-language-wrap trp-language-wrap-bottom"> <a href="https://www.railscarma.com/blog/technical-articles/learning-the-fundamentals-of-nokogiri-gem/" title="English"> <img class="trp-flag-image" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2018%2012'%3E%3C/svg%3E" width="18" height="12" alt="en_US" title="English" data-lazy-src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/en_US.png"><noscript><img class="trp-flag-image" src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/en_US.png" width="18" height="12" alt="en_US" title="English"></noscript>English </a> <a href="https://www.railscarma.com/ja/ブログ/technical-articles/learning-the-fundamentals-of-nokogiri-gem/" title="Japanese"> <img class="trp-flag-image" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2018%2012'%3E%3C/svg%3E" width="18" height="12" alt="ja" title="Japanese" data-lazy-src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/ja.png"><noscript><img class="trp-flag-image" src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/ja.png" width="18" height="12" alt="ja" title="Japanese"></noscript>Japanese </a> <a href="https://www.railscarma.com/de/blog/technical-articles/erlernen-der-grundlagen-von-nokogiri-gem/" title="German"> <img class="trp-flag-image" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2018%2012'%3E%3C/svg%3E" width="18" height="12" alt="de_DE" title="German" data-lazy-src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/de_DE.png"><noscript><img class="trp-flag-image" src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/de_DE.png" width="18" height="12" alt="de_DE" title="German"></noscript>German </a> <a href="https://www.railscarma.com/fr/blog/technical-articles/apprendre-les-bases-de-la-gemme-nokogiri/" title="French"> <img class="trp-flag-image" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2018%2012'%3E%3C/svg%3E" width="18" height="12" alt="fr_FR" title="French" data-lazy-src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/fr_FR.png"><noscript><img class="trp-flag-image" src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/fr_FR.png" width="18" height="12" alt="fr_FR" title="French"></noscript>French </a> <a href="https://www.railscarma.com/es/blog/technical-articles/learning-the-fundamentals-of-nokogiri-gem/" title="Spanish"> <img class="trp-flag-image" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2018%2012'%3E%3C/svg%3E" width="18" height="12" alt="es_ES" title="Spanish" data-lazy-src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/es_ES.png"><noscript><img class="trp-flag-image" src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/es_ES.png" width="18" height="12" alt="es_ES" title="Spanish"></noscript>Spanish </a> <a href="https://www.railscarma.com/sv/blogg/technical-articles/lara-dig-grunderna-i-nokogiri-gem/" title="Swedish"> <img class="trp-flag-image" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2018%2012'%3E%3C/svg%3E" width="18" height="12" alt="sv_SE" title="Swedish" data-lazy-src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/sv_SE.png"><noscript><img class="trp-flag-image" src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/sv_SE.png" width="18" height="12" alt="sv_SE" title="Swedish"></noscript>Swedish </a> <a href="#" class="trp-floater-ls-disabled-language trp-ls-disabled-language" onclick="event.preventDefault()"><img class="trp-flag-image" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2018%2012'%3E%3C/svg%3E" width="18" height="12" alt="it_IT" title="Italian" data-lazy-src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/it_IT.png"><noscript><img class="trp-flag-image" src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/it_IT.png" width="18" height="12" alt="it_IT" title="Italian"></noscript>Italian</a></div> </div> </div> <div class="trp_model_container" id="trp_ald_modal_container" style="display: none" data-no-dynamic-translation data-no-translation> <div class="trp_ald_modal" id="trp_ald_modal_popup"> <div id="trp_ald_popup_text"></div> <div class="trp_ald_select_and_button"> <div class="trp_ald_ls_container"> <div class="trp-language-switcher trp-language-switcher-container" id="trp_ald_popup_select_container" data-no-translation> <div class="trp-ls-shortcode-current-language" id="en_US" special-selector="trp_ald_popup_current_language" data-trp-ald-selected-language= "en_US"> <img class="trp-flag-image" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2018%2012'%3E%3C/svg%3E" width="18" height="12" alt="en_US" title="English" data-lazy-src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/en_US.png"><noscript><img class="trp-flag-image" src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/en_US.png" width="18" height="12" alt="en_US" title="English"></noscript> English </div> <div class="trp-ls-shortcode-language"> <div class="trp-ald-popup-select" id="en_US" data-trp-ald-selected-language = "en_US"> <img class="trp-flag-image" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2018%2012'%3E%3C/svg%3E" width="18" height="12" alt="en_US" title="English" data-lazy-src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/en_US.png"><noscript><img class="trp-flag-image" src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/en_US.png" width="18" height="12" alt="en_US" title="English"></noscript> English </div> <div class="trp-ald-popup-select" id="ja" data-trp-ald-selected-language = "ja"> <img class="trp-flag-image" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2018%2012'%3E%3C/svg%3E" width="18" height="12" alt="ja" title="Japanese" data-lazy-src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/ja.png"><noscript><img class="trp-flag-image" src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/ja.png" width="18" height="12" alt="ja" title="Japanese"></noscript> Japanese </div> <div class="trp-ald-popup-select" id="de_DE" data-trp-ald-selected-language = "de_DE"> <img class="trp-flag-image" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2018%2012'%3E%3C/svg%3E" width="18" height="12" alt="de_DE" title="German" data-lazy-src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/de_DE.png"><noscript><img class="trp-flag-image" src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/de_DE.png" width="18" height="12" alt="de_DE" title="German"></noscript> German </div> <div class="trp-ald-popup-select" id="fr_FR" data-trp-ald-selected-language = "fr_FR"> <img class="trp-flag-image" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2018%2012'%3E%3C/svg%3E" width="18" height="12" alt="fr_FR" title="French" data-lazy-src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/fr_FR.png"><noscript><img class="trp-flag-image" src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/fr_FR.png" width="18" height="12" alt="fr_FR" title="French"></noscript> French </div> <div class="trp-ald-popup-select" id="es_ES" data-trp-ald-selected-language = "es_ES"> <img class="trp-flag-image" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2018%2012'%3E%3C/svg%3E" width="18" height="12" alt="es_ES" title="Spanish" data-lazy-src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/es_ES.png"><noscript><img class="trp-flag-image" src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/es_ES.png" width="18" height="12" alt="es_ES" title="Spanish"></noscript> Spanish </div> <div class="trp-ald-popup-select" id="it_IT" data-trp-ald-selected-language = "it_IT"> <img class="trp-flag-image" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2018%2012'%3E%3C/svg%3E" width="18" height="12" alt="it_IT" title="Italian" data-lazy-src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/it_IT.png"><noscript><img class="trp-flag-image" src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/it_IT.png" width="18" height="12" alt="it_IT" title="Italian"></noscript> Italian </div> <div class="trp-ald-popup-select" id="sv_SE" data-trp-ald-selected-language = "sv_SE"> <img class="trp-flag-image" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2018%2012'%3E%3C/svg%3E" width="18" height="12" alt="sv_SE" title="Swedish" data-lazy-src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/sv_SE.png"><noscript><img class="trp-flag-image" src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/sv_SE.png" width="18" height="12" alt="sv_SE" title="Swedish"></noscript> Swedish </div> </div> </div> </div> <div class="trp_ald_button"> <a href="https://www.railscarma.com" id="trp_ald_popup_change_language"></a> </div> </div> <a id="trp_ald_x_button_and_textarea" href="#"> <span id="trp_ald_x_button"></span><span id="trp_ald_x_button_textarea"></span></a> </div> </div> <template id="trp_ald_no_text_popup_template"> <div id="trp_no_text_popup_wrap"> <div id="trp_no_text_popup" class="trp_ald_no_text_popup" data-no-dynamic-translation data-no-translation> <div id="trp_ald_not_text_popup_ls_and_button"> <div id="trp_ald_no_text_popup_div"> <span id="trp_ald_no_text_popup_text"></span> </div> <div class="trp_ald_ls_container"> <div class="trp-language-switcher trp-language-switcher-container" id="trp_ald_no_text_select" data-no-translation> <div class="trp-ls-shortcode-current-language" id="en_US" special-selector="trp_ald_popup_current_language" data-trp-ald-selected-language="en_US"> <img class="trp-flag-image" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2018%2012'%3E%3C/svg%3E" width="18" height="12" alt="en_US" title="English" data-lazy-src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/en_US.png"><noscript><img class="trp-flag-image" src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/en_US.png" width="18" height="12" alt="en_US" title="English"></noscript> English </div> <div class="trp-ls-shortcode-language" id="trp_ald_no_text_popup_select_container"> <div class="trp-ald-popup-select" id="en_US" data-trp-ald-selected-language= "en_US"> <img class="trp-flag-image" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2018%2012'%3E%3C/svg%3E" width="18" height="12" alt="en_US" title="English" data-lazy-src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/en_US.png"><noscript><img class="trp-flag-image" src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/en_US.png" width="18" height="12" alt="en_US" title="English"></noscript> English </div> <div class="trp-ald-popup-select" id="ja" data-trp-ald-selected-language="ja"> <img class="trp-flag-image" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2018%2012'%3E%3C/svg%3E" width="18" height="12" alt="ja" title="Japanese" data-lazy-src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/ja.png"><noscript><img class="trp-flag-image" src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/ja.png" width="18" height="12" alt="ja" title="Japanese"></noscript> Japanese </div> <div class="trp-ald-popup-select" id="de_DE" data-trp-ald-selected-language="de_DE"> <img class="trp-flag-image" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2018%2012'%3E%3C/svg%3E" width="18" height="12" alt="de_DE" title="German" data-lazy-src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/de_DE.png"><noscript><img class="trp-flag-image" src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/de_DE.png" width="18" height="12" alt="de_DE" title="German"></noscript> German </div> <div class="trp-ald-popup-select" id="fr_FR" data-trp-ald-selected-language="fr_FR"> <img class="trp-flag-image" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2018%2012'%3E%3C/svg%3E" width="18" height="12" alt="fr_FR" title="French" data-lazy-src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/fr_FR.png"><noscript><img class="trp-flag-image" src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/fr_FR.png" width="18" height="12" alt="fr_FR" title="French"></noscript> French </div> <div class="trp-ald-popup-select" id="es_ES" data-trp-ald-selected-language="es_ES"> <img class="trp-flag-image" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2018%2012'%3E%3C/svg%3E" width="18" height="12" alt="es_ES" title="Spanish" data-lazy-src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/es_ES.png"><noscript><img class="trp-flag-image" src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/es_ES.png" width="18" height="12" alt="es_ES" title="Spanish"></noscript> Spanish </div> <div class="trp-ald-popup-select" id="it_IT" data-trp-ald-selected-language="it_IT"> <img class="trp-flag-image" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2018%2012'%3E%3C/svg%3E" width="18" height="12" alt="it_IT" title="Italian" data-lazy-src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/it_IT.png"><noscript><img class="trp-flag-image" src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/it_IT.png" width="18" height="12" alt="it_IT" title="Italian"></noscript> Italian </div> <div class="trp-ald-popup-select" id="sv_SE" data-trp-ald-selected-language="sv_SE"> <img class="trp-flag-image" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2018%2012'%3E%3C/svg%3E" width="18" height="12" alt="sv_SE" title="Swedish" data-lazy-src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/sv_SE.png"><noscript><img class="trp-flag-image" src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/sv_SE.png" width="18" height="12" alt="sv_SE" title="Swedish"></noscript> Swedish </div> </div> </div> </div> <div class="trp_ald_change_language_div"> <a href="https://www.railscarma.com" id="trp_ald_no_text_popup_change_language"></a> </div> <div id="trp_ald_no_text_popup_x_button_and_textarea"> <a id="trp_ald_no_text_popup_x_button"></a><span id="trp_ald_no_text_popup_x_button_textarea"></span></div> </div> <div id="trp_ald_no_text_popup_x"> <button id="trp_close"></button> </div> </div> </div> </template> <!-- GTM Container placement set to footer --> <!-- Google Tag Manager (noscript) --> <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-59W5" height="0" width="0" style="display:none;visibility:hidden" aria-hidden="true"></iframe></noscript> <!-- End Google Tag Manager (noscript) --><style type='text/css' class='astra-megamenu-inline-style'>.ast-desktop .astra-megamenu-li.menu-item-2074 .astra-full-megamenu-wrapper, .ast-desktop .astra-megamenu-li.menu-item-2074 .astra-mega-menu-width-menu-container, .ast-desktop .astra-megamenu-li.menu-item-2074 .astra-mega-menu-width-content, .ast-desktop .astra-megamenu-li.menu-item-2074 .astra-mega-menu-width-custom{background-color:#ffffff;}</style><!-- Click to Chat - https://holithemes.com/plugins/click-to-chat/ v3.34 --> <div class="ht-ctc ht-ctc-chat ctc-analytics ctc_wp_desktop style-3 ctc_side_positions" id="ht-ctc-chat" style="display: none; position: fixed; top: 15px; right: 15px;" > <div class="ht_ctc_style ht_ctc_chat_style"> <div style="display:flex;justify-content:center;align-items:center; " class="ctc_s_3 ctc_nb" data-nb_top="-5px" data-nb_right="-5px"> <p class="ctc-analytics ctc_cta ctc_cta_stick ht-ctc-cta ht-ctc-cta-hover ctc_m_cta_order_1" style="padding: 0px 16px; line-height: 1.6; font-size: 15px; background-color: #25d366; color: #ffffff; border-radius:10px; margin:0 10px; display: none; order: 0; " data-no-translation="" data-trp-gettext="">Scrivici su WhatsApp</p> <svg style="pointer-events:none; display:block; height:50px; width:50px;" width="50px" height="50px" viewbox="0 0 1219.547 1225.016"> <path style="fill: #E0E0E0;" fill="#E0E0E0" d="M1041.858 178.02C927.206 63.289 774.753.07 612.325 0 277.617 0 5.232 272.298 5.098 606.991c-.039 106.986 27.915 211.42 81.048 303.476L0 1225.016l321.898-84.406c88.689 48.368 188.547 73.855 290.166 73.896h.258.003c334.654 0 607.08-272.346 607.222-607.023.056-162.208-63.052-314.724-177.689-429.463zm-429.533 933.963h-.197c-90.578-.048-179.402-24.366-256.878-70.339l-18.438-10.93-191.021 50.083 51-186.176-12.013-19.087c-50.525-80.336-77.198-173.175-77.16-268.504.111-278.186 226.507-504.503 504.898-504.503 134.812.056 261.519 52.604 356.814 147.965 95.289 95.36 147.728 222.128 147.688 356.948-.118 278.195-226.522 504.543-504.693 504.543z"/> <lineargradient id="htwaicona-chat" gradientunits="userSpaceOnUse" x1="609.77" y1="1190.114" x2="609.77" y2="21.084"> <stop offset="0" stop-color="#20b038"/> <stop offset="1" stop-color="#60d66a"/> </lineargradient> <path style="fill: url(#htwaicona-chat);" fill="url(#htwaicona-chat)" d="M27.875 1190.114l82.211-300.18c-50.719-87.852-77.391-187.523-77.359-289.602.133-319.398 260.078-579.25 579.469-579.25 155.016.07 300.508 60.398 409.898 169.891 109.414 109.492 169.633 255.031 169.57 409.812-.133 319.406-260.094 579.281-579.445 579.281-.023 0 .016 0 0 0h-.258c-96.977-.031-192.266-24.375-276.898-70.5l-307.188 80.548z"/> <image overflow="visible" opacity=".08" width="682" height="639" transform="translate(270.984 291.372)"/> <path fill-rule="evenodd" clip-rule="evenodd" style="fill: #FFFFFF;" fill="#FFF" d="M462.273 349.294c-11.234-24.977-23.062-25.477-33.75-25.914-8.742-.375-18.75-.352-28.742-.352-10 0-26.25 3.758-39.992 18.766-13.75 15.008-52.5 51.289-52.5 125.078 0 73.797 53.75 145.102 61.242 155.117 7.5 10 103.758 166.266 256.203 226.383 126.695 49.961 152.477 40.023 179.977 37.523s88.734-36.273 101.234-71.297c12.5-35.016 12.5-65.031 8.75-71.305-3.75-6.25-13.75-10-28.75-17.5s-88.734-43.789-102.484-48.789-23.75-7.5-33.75 7.516c-10 15-38.727 48.773-47.477 58.773-8.75 10.023-17.5 11.273-32.5 3.773-15-7.523-63.305-23.344-120.609-74.438-44.586-39.75-74.688-88.844-83.438-103.859-8.75-15-.938-23.125 6.586-30.602 6.734-6.719 15-17.508 22.5-26.266 7.484-8.758 9.984-15.008 14.984-25.008 5-10.016 2.5-18.773-1.25-26.273s-32.898-81.67-46.234-111.326z"/> <path style="fill: #FFFFFF;" fill="#FFF" d="M1036.898 176.091C923.562 62.677 772.859.185 612.297.114 281.43.114 12.172 269.286 12.039 600.137 12 705.896 39.633 809.13 92.156 900.13L7 1211.067l318.203-83.438c87.672 47.812 186.383 73.008 286.836 73.047h.255.003c330.812 0 600.109-269.219 600.25-600.055.055-160.343-62.328-311.108-175.649-424.53zm-424.601 923.242h-.195c-89.539-.047-177.344-24.086-253.93-69.531l-18.227-10.805-188.828 49.508 50.414-184.039-11.875-18.867c-49.945-79.414-76.312-171.188-76.273-265.422.109-274.992 223.906-498.711 499.102-498.711 133.266.055 258.516 52 352.719 146.266 94.195 94.266 146.031 219.578 145.992 352.852-.118 274.999-223.923 498.749-498.899 498.749z"/> </svg></div> </div> </div> <span class="ht_ctc_chat_data" data-no_number="" data-settings="{"number":"917012098783","pre_filled":"Ciao","dis_m":"show","dis_d":"show","css":"display: none; cursor: pointer; z-index: 99999999;","pos_d":"position: fixed; top: 15px; right: 15px;","pos_m":"position: fixed; bottom: 10px; left: 10px;","schedule":"no","se":150,"ani":"no-animations","url_target_d":"_blank","ga":"yes","fb":"yes","g_an_event_name":"chat: {number}","pixel_event_name":"Click to Chat by HoliThemes"}" ></span> <link rel='stylesheet' id='owl.carousel-css' href='https://www.railscarma.com/wp-content/plugins/related-post/assets/front/css/owl.carousel.min.css?ver=6.4.5' media='all' /> <link rel='stylesheet' id='related-post-css' href='https://www.railscarma.com/wp-content/plugins/related-post/assets/front/css/related-post.css?ver=6.4.5' media='all' /> <link rel='stylesheet' id='cookie-law-info-table-css' href='https://www.railscarma.com/wp-content/plugins/cookie-law-info/public/css/cookie-law-info-table.css?ver=2.0.2' media='all' /> <script id="trp-dynamic-translator-js-extra"> var trp_data = {"trp_custom_ajax_url":"https:\/\/www.railscarma.com\/wp-content\/plugins\/translatepress-multilingual\/includes\/trp-ajax.php","trp_wp_ajax_url":"https:\/\/www.railscarma.com\/wp-admin\/admin-ajax.php","trp_language_to_query":"it_IT","trp_original_language":"en_US","trp_current_language":"it_IT","trp_skip_selectors":["[data-no-translation]","[data-no-dynamic-translation]","[data-trp-translate-id-innertext]","script","style","head","trp-span","translate-press","[data-trp-translate-id]","[data-trpgettextoriginal]","[data-trp-post-slug]"],"trp_base_selectors":["data-trp-translate-id","data-trpgettextoriginal","data-trp-post-slug"],"trp_attributes_selectors":{"text":{"accessor":"outertext","attribute":false},"block":{"accessor":"innertext","attribute":false},"image_src":{"selector":"img[src]","accessor":"src","attribute":true},"submit":{"selector":"input[type='submit'],input[type='button'], input[type='reset']","accessor":"value","attribute":true},"placeholder":{"selector":"input[placeholder],textarea[placeholder]","accessor":"placeholder","attribute":true},"title":{"selector":"[title]","accessor":"title","attribute":true},"a_href":{"selector":"a[href]","accessor":"href","attribute":true},"button":{"accessor":"outertext","attribute":false},"option":{"accessor":"innertext","attribute":false},"aria_label":{"selector":"[aria-label]","accessor":"aria-label","attribute":true},"image_alt":{"selector":"img[alt]","accessor":"alt","attribute":true},"meta_desc":{"selector":"meta[name=\"description\"],meta[property=\"og:title\"],meta[property=\"og:description\"],meta[property=\"og:site_name\"],meta[property=\"og:image:alt\"],meta[name=\"twitter:title\"],meta[name=\"twitter:description\"],meta[name=\"twitter:image:alt\"],meta[name=\"DC.Title\"],meta[name=\"DC.Description\"],meta[property=\"article:section\"],meta[property=\"article:tag\"]","accessor":"content","attribute":true},"page_title":{"selector":"title","accessor":"innertext","attribute":false},"meta_desc_img":{"selector":"meta[property=\"og:image\"],meta[property=\"og:image:secure_url\"],meta[name=\"twitter:image\"]","accessor":"content","attribute":true}},"trp_attributes_accessors":["outertext","innertext","src","value","placeholder","title","href","aria-label","alt","content"],"gettranslationsnonceregular":"cc7c962570","showdynamiccontentbeforetranslation":"","skip_strings_from_dynamic_translation":[],"skip_strings_from_dynamic_translation_for_substrings":{"href":["amazon-adsystem","googleads","g.doubleclick"]},"duplicate_detections_allowed":"100","trp_translate_numerals_opt":"no","trp_no_auto_translation_selectors":["[data-no-auto-translation]"]}; </script> <script src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/js/trp-translate-dom-changes.js?ver=2.9.0" id="trp-dynamic-translator-js"></script> <script src="https://www.railscarma.com/wp-includes/js/comment-reply.min.js?ver=6.4.5" id="comment-reply-js" async data-wp-strategy="async"></script> <script id="astra-theme-js-js-extra"> var astra = {"break_point":"921","isRtl":""}; </script> <script src="https://www.railscarma.com/wp-content/themes/astra/assets/js/minified/style.min.js?ver=2.5.5" id="astra-theme-js-js"></script> <script id="ht_ctc_app_js-js-extra"> var ht_ctc_chat_var = {"number":"917012098783","pre_filled":"Ciao","dis_m":"show","dis_d":"show","css":"display: none; cursor: pointer; z-index: 99999999;","pos_d":"position: fixed; top: 15px; right: 15px;","pos_m":"position: fixed; bottom: 10px; left: 10px;","schedule":"no","se":"150","ani":"no-animations","url_target_d":"_blank","ga":"yes","fb":"yes","g_an_event_name":"chat: {number}","pixel_event_name":"Click to Chat by HoliThemes"}; var ht_ctc_variables = {"g_an_event_name":"chat: {number}","pixel_event_type":"trackCustom","pixel_event_name":"Click to Chat by HoliThemes","g_an_params":["g_an_param_1","g_an_param_2","g_an_param_3"],"g_an_param_1":{"key":"number","value":"{number}"},"g_an_param_2":{"key":"title","value":"{title}"},"g_an_param_3":{"key":"url","value":"{url}"},"pixel_params":["pixel_param_1","pixel_param_2","pixel_param_3","pixel_param_4"],"pixel_param_1":{"key":"Category","value":"Click to Chat for WhatsApp"},"pixel_param_2":{"key":"ID","value":"{number}"},"pixel_param_3":{"key":"Title","value":"{title}"},"pixel_param_4":{"key":"URL","value":"{url}"}}; </script> <script src="https://www.railscarma.com/wp-content/plugins/click-to-chat-for-whatsapp/new/inc/assets/js/app.js?ver=3.34" id="ht_ctc_app_js-js"></script> <script id="wpcf7-redirect-script-js-extra"> var wpcf7_redirect_forms = {"35655":{"page_id":"0","external_url":"","use_external_url":"","open_in_new_tab":"","http_build_query":"","http_build_query_selectively":"","http_build_query_selectively_fields":"","delay_redirect":"0","after_sent_script":"","thankyou_page_url":""},"32472":{"page_id":"32482","external_url":"","use_external_url":"","open_in_new_tab":"","http_build_query":"","http_build_query_selectively":"","http_build_query_selectively_fields":"","delay_redirect":"0","after_sent_script":"","thankyou_page_url":"https:\/\/www.railscarma.com\/it\/feedback-thank-you\/"},"32462":{"page_id":"0","external_url":"","use_external_url":"","open_in_new_tab":"","http_build_query":"","http_build_query_selectively":"","http_build_query_selectively_fields":"","delay_redirect":"0","after_sent_script":"","thankyou_page_url":""},"32434":{"page_id":"0","external_url":"","use_external_url":"","open_in_new_tab":"","http_build_query":"","http_build_query_selectively":"","http_build_query_selectively_fields":"","delay_redirect":"0","after_sent_script":"","thankyou_page_url":""},"4":{"page_id":"","external_url":"","use_external_url":"","open_in_new_tab":"","http_build_query":"","http_build_query_selectively":"","http_build_query_selectively_fields":"","delay_redirect":"","after_sent_script":"","thankyou_page_url":""}}; </script> <script src="https://www.railscarma.com/wp-content/plugins/cf7-redirection/js/wpcf7-redirect-script.js" id="wpcf7-redirect-script-js"></script> <script src="https://www.railscarma.com/wp-content/plugins/wp-responsive-testimonials-slider-and-widget/assets/js/video.js?ver=1.5" id="rtsw-script-video-js"></script> <script src="https://www.railscarma.com/wp-content/plugins/wp-responsive-testimonials-slider-and-widget/assets/js/magnific-popup.min.js?ver=1.5" id="wpoh-magnific-js-js"></script> <script src="https://www.railscarma.com/wp-content/plugins/wp-responsive-testimonials-slider-and-widget/assets/js/rtsw-public.js?ver=1.5" id="rtsw-script-js"></script> <script src="https://www.railscarma.com/wp-content/plugins/duracelltomi-google-tag-manager/dist/js/gtm4wp-form-move-tracker.js?ver=1.20.2" id="gtm4wp-form-move-tracker-js"></script> <script id="rocket-browser-checker-js-after"> "use strict";var _createClass=function(){function defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||!1,descriptor.configurable=!0,"value"in descriptor&&(descriptor.writable=!0),Object.defineProperty(target,descriptor.key,descriptor)}}return function(Constructor,protoProps,staticProps){return protoProps&&defineProperties(Constructor.prototype,protoProps),staticProps&&defineProperties(Constructor,staticProps),Constructor}}();function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}var RocketBrowserCompatibilityChecker=function(){function RocketBrowserCompatibilityChecker(options){_classCallCheck(this,RocketBrowserCompatibilityChecker),this.passiveSupported=!1,this._checkPassiveOption(this),this.options=!!this.passiveSupported&&options}return _createClass(RocketBrowserCompatibilityChecker,[{key:"_checkPassiveOption",value:function(self){try{var options={get passive(){return!(self.passiveSupported=!0)}};window.addEventListener("test",null,options),window.removeEventListener("test",null,options)}catch(err){self.passiveSupported=!1}}},{key:"initRequestIdleCallback",value:function(){!1 in window&&(window.requestIdleCallback=function(cb){var start=Date.now();return setTimeout(function(){cb({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-start))}})},1)}),!1 in window&&(window.cancelIdleCallback=function(id){return clearTimeout(id)})}},{key:"isDataSaverModeOn",value:function(){return"connection"in navigator&&!0===navigator.connection.saveData}},{key:"supportsLinkPrefetch",value:function(){var elem=document.createElement("link");return elem.relList&&elem.relList.supports&&elem.relList.supports("prefetch")&&window.IntersectionObserver&&"isIntersecting"in IntersectionObserverEntry.prototype}},{key:"isSlowConnection",value:function(){return"connection"in navigator&&"effectiveType"in navigator.connection&&("2g"===navigator.connection.effectiveType||"slow-2g"===navigator.connection.effectiveType)}}]),RocketBrowserCompatibilityChecker}(); </script> <script id="rocket-preload-links-js-extra"> var RocketPreloadLinksConfig = {"excludeUris":"\/it(\/(?:.+\/)?feed(?:\/(?:.+\/?)?)?$|\/(?:.+\/)?embed\/|\/(index.php\/)?(.*)wp-json(\/.*|$))|\/refer\/|\/go\/|\/recommend\/|\/recommends\/","usesTrailingSlash":"1","imageExt":"jpg|jpeg|gif|png|tiff|bmp|webp|avif|pdf|doc|docx|xls|xlsx|php","fileExt":"jpg|jpeg|gif|png|tiff|bmp|webp|avif|pdf|doc|docx|xls|xlsx|php|html|htm","siteUrl":"https:\/\/www.railscarma.com\/it","onHoverDelay":"100","rateThrottle":"3"}; </script> <script id="rocket-preload-links-js-after"> (function() { "use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e=function(){function i(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(e,t,n){return t&&i(e.prototype,t),n&&i(e,n),e}}();function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var t=function(){function n(e,t){i(this,n),this.browser=e,this.config=t,this.options=this.browser.options,this.prefetched=new Set,this.eventTime=null,this.threshold=1111,this.numOnHover=0}return e(n,[{key:"init",value:function(){!this.browser.supportsLinkPrefetch()||this.browser.isDataSaverModeOn()||this.browser.isSlowConnection()||(this.regex={excludeUris:RegExp(this.config.excludeUris,"i"),images:RegExp(".("+this.config.imageExt+")$","i"),fileExt:RegExp(".("+this.config.fileExt+")$","i")},this._initListeners(this))}},{key:"_initListeners",value:function(e){-1<this.config.onHoverDelay&&document.addEventListener("mouseover",e.listener.bind(e),e.listenerOptions),document.addEventListener("mousedown",e.listener.bind(e),e.listenerOptions),document.addEventListener("touchstart",e.listener.bind(e),e.listenerOptions)}},{key:"listener",value:function(e){var t=e.target.closest("a"),n=this._prepareUrl(t);if(null!==n)switch(e.type){case"mousedown":case"touchstart":this._addPrefetchLink(n);break;case"mouseover":this._earlyPrefetch(t,n,"mouseout")}}},{key:"_earlyPrefetch",value:function(t,e,n){var i=this,r=setTimeout(function(){if(r=null,0===i.numOnHover)setTimeout(function(){return i.numOnHover=0},1e3);else if(i.numOnHover>i.config.rateThrottle)return;i.numOnHover++,i._addPrefetchLink(e)},this.config.onHoverDelay);t.addEventListener(n,function e(){t.removeEventListener(n,e,{passive:!0}),null!==r&&(clearTimeout(r),r=null)},{passive:!0})}},{key:"_addPrefetchLink",value:function(i){return this.prefetched.add(i.href),new Promise(function(e,t){var n=document.createElement("link");n.rel="prefetch",n.href=i.href,n.onload=e,n.onerror=t,document.head.appendChild(n)}).catch(function(){})}},{key:"_prepareUrl",value:function(e){if(null===e||"object"!==(void 0===e?"undefined":r(e))||!1 in e||-1===["http:","https:"].indexOf(e.protocol))return null;var t=e.href.substring(0,this.config.siteUrl.length),n=this._getPathname(e.href,t),i={original:e.href,protocol:e.protocol,origin:t,pathname:n,href:t+n};return this._isLinkOk(i)?i:null}},{key:"_getPathname",value:function(e,t){var n=t?e.substring(this.config.siteUrl.length):e;return n.startsWith("/")||(n="/"+n),this._shouldAddTrailingSlash(n)?n+"/":n}},{key:"_shouldAddTrailingSlash",value:function(e){return this.config.usesTrailingSlash&&!e.endsWith("/")&&!this.regex.fileExt.test(e)}},{key:"_isLinkOk",value:function(e){return null!==e&&"object"===(void 0===e?"undefined":r(e))&&(!this.prefetched.has(e.href)&&e.origin===this.config.siteUrl&&-1===e.href.indexOf("?")&&-1===e.href.indexOf("#")&&!this.regex.excludeUris.test(e.href)&&!this.regex.images.test(e.href))}}],[{key:"run",value:function(){"undefined"!=typeof RocketPreloadLinksConfig&&new n(new RocketBrowserCompatibilityChecker({capture:!0,passive:!0}),RocketPreloadLinksConfig).init()}}]),n}();t.run(); }()); </script> <script id="astra-addon-js-js-extra"> var astraAddon = {"sticky_active":"1","svgIconClose":"<span class=\"ast-icon icon-close\"><\/span>","header_main_stick":"1","header_above_stick":"0","header_below_stick":"0","stick_header_meta":"","header_main_stick_meta":"","header_above_stick_meta":"","header_below_stick_meta":"","sticky_header_on_devices":"desktop","sticky_header_style":"none","sticky_hide_on_scroll":"0","break_point":"921","tablet_break_point":"921","mobile_break_point":"544","header_main_shrink":"1","header_logo_width":"","responsive_header_logo_width":{"desktop":"","tablet":"","mobile":""},"stick_origin_position":"","site_layout":"","site_content_width":"1240","site_layout_padded_width":"1200","site_layout_box_width":"1200","header_builder_active":"","component_limit":"10","is_header_builder_active":""}; </script> <script src="https://www.railscarma.com/wp-content/uploads/astra-addon/astra-addon-66b33bb97afe89-20915224.js?ver=3.9.1" id="astra-addon-js-js"></script> <script src="https://www.railscarma.com/wp-content/plugins/related-post//assets/front/js/owl.carousel.min.js?ver=6.4.5" id="owl.carousel-js"></script> <script src="https://www.railscarma.com/wp-content/plugins/elementor/assets/js/webpack.runtime.min.js?ver=3.20.1" id="elementor-webpack-runtime-js"></script> <script src="https://www.railscarma.com/wp-content/plugins/elementor/assets/js/frontend-modules.min.js?ver=3.20.1" id="elementor-frontend-modules-js"></script> <script src="https://www.railscarma.com/wp-content/plugins/elementor/assets/lib/waypoints/waypoints.min.js?ver=4.0.2" id="elementor-waypoints-js"></script> <script src="https://www.railscarma.com/wp-includes/js/jquery/ui/core.min.js?ver=1.13.2" id="jquery-ui-core-js"></script> <script id="elementor-frontend-js-extra"> var uael_particles_script = {"uael_particles_url":"https:\/\/www.railscarma.com\/wp-content\/plugins\/ultimate-elementor\/assets\/min-js\/uael-particles.min.js","particles_url":"https:\/\/www.railscarma.com\/wp-content\/plugins\/ultimate-elementor\/assets\/lib\/particles\/particles.min.js","snowflakes_image":"https:\/\/www.railscarma.com\/wp-content\/plugins\/ultimate-elementor\/assets\/img\/snowflake.svg","gift":"https:\/\/www.railscarma.com\/wp-content\/plugins\/ultimate-elementor\/assets\/img\/gift.png","tree":"https:\/\/www.railscarma.com\/wp-content\/plugins\/ultimate-elementor\/assets\/img\/tree.png","skull":"https:\/\/www.railscarma.com\/wp-content\/plugins\/ultimate-elementor\/assets\/img\/skull.png","ghost":"https:\/\/www.railscarma.com\/wp-content\/plugins\/ultimate-elementor\/assets\/img\/ghost.png","moon":"https:\/\/www.railscarma.com\/wp-content\/plugins\/ultimate-elementor\/assets\/img\/moon.png","bat":"https:\/\/www.railscarma.com\/wp-content\/plugins\/ultimate-elementor\/assets\/img\/bat.png","pumpkin":"https:\/\/www.railscarma.com\/wp-content\/plugins\/ultimate-elementor\/assets\/img\/pumpkin.png"}; </script> <script id="elementor-frontend-js-before"> var elementorFrontendConfig = {"environmentMode":{"edit":false,"wpPreview":false,"isScriptDebug":false},"i18n":{"shareOnFacebook":"Condividi su Facebook","shareOnTwitter":"Condividi su Twitter","pinIt":"Fissalo","download":"Scaricamento","downloadImage":"Scarica l'immagine","fullscreen":"A schermo intero","zoom":"Ingrandisci","share":"Condividere","playVideo":"Riproduci video","previous":"Precedente","next":"Prossimo","close":"Vicino","a11yCarouselWrapperAriaLabel":"Carosello | Scorrimento orizzontale: Freccia sinistra & destra","a11yCarouselPrevSlideMessage":"Diapositiva precedente","a11yCarouselNextSlideMessage":"Prossima diapositiva","a11yCarouselFirstSlideMessage":"Questa \u00e9 la prima diapositiva","a11yCarouselLastSlideMessage":"Questa \u00e8 l'ultima diapositiva","a11yCarouselPaginationBulletMessage":"Vai alla diapositiva"},"is_rtl":false,"breakpoints":{"xs":0,"sm":480,"md":768,"lg":1025,"xl":1440,"xxl":1600},"responsive":{"breakpoints":{"mobile":{"label":"Mobile Portrait","value":767,"default_value":767,"direction":"max","is_enabled":true},"mobile_extra":{"label":"Mobile Landscape","value":880,"default_value":880,"direction":"max","is_enabled":false},"tablet":{"label":"Tablet verticale","value":1024,"default_value":1024,"direction":"max","is_enabled":true},"tablet_extra":{"label":"Tablet orizzontale","value":1200,"default_value":1200,"direction":"max","is_enabled":false},"laptop":{"label":"Laptop","value":1366,"default_value":1366,"direction":"max","is_enabled":false},"widescreen":{"label":"Widescreen","value":2400,"default_value":2400,"direction":"min","is_enabled":false}}},"version":"3.20.1","is_static":false,"experimentalFeatures":{"e_optimized_assets_loading":true,"additional_custom_breakpoints":true,"e_swiper_latest":true,"block_editor_assets_optimize":true,"ai-layout":true,"landing-pages":true,"e_image_loading_optimization":true},"urls":{"assets":"https:\/\/www.railscarma.com\/wp-content\/plugins\/elementor\/assets\/"},"swiperClass":"swiper","settings":{"page":[],"editorPreferences":[]},"kit":{"active_breakpoints":["viewport_mobile","viewport_tablet"],"global_image_lightbox":"yes","lightbox_enable_counter":"yes","lightbox_enable_fullscreen":"yes","lightbox_enable_zoom":"yes","lightbox_enable_share":"yes","lightbox_title_src":"title","lightbox_description_src":"description"},"post":{"id":7611,"title":"Learning%20the%20Fundamentals%20of%20Nokogiri%20Gem%20-%20RailsCarma%20-%20Ruby%20on%20Rails%20Development%20Company%20specializing%20in%20Offshore%20Development","excerpt":"","featuredImage":"https:\/\/www.railscarma.com\/wp-content\/uploads\/2016\/01\/nokogiri.png"}}; </script> <script src="https://www.railscarma.com/wp-content/plugins/elementor/assets/js/frontend.min.js?ver=3.20.1" id="elementor-frontend-js"></script> <script id="elementor-frontend-js-after"> window.scope_array = []; window.backend = 0; jQuery.cachedScript = function( url, options ) { // Allow user to set any option except for dataType, cache, and url. options = jQuery.extend( options || {}, { dataType: "script", cache: true, url: url }); // Return the jqXHR object so we can chain callbacks. return jQuery.ajax( options ); }; jQuery( window ).on( "elementor/frontend/init", function() { elementorFrontend.hooks.addAction( "frontend/element_ready/global", function( $scope, $ ){ if ( "undefined" == typeof $scope ) { return; } if ( $scope.hasClass( "uael-particle-yes" ) ) { window.scope_array.push( $scope ); $scope.find(".uael-particle-wrapper").addClass("js-is-enabled"); }else{ return; } if(elementorFrontend.isEditMode() && $scope.find(".uael-particle-wrapper").hasClass("js-is-enabled") && window.backend == 0 ){ var uael_url = uael_particles_script.uael_particles_url; jQuery.cachedScript( uael_url ); window.backend = 1; }else if(elementorFrontend.isEditMode()){ var uael_url = uael_particles_script.uael_particles_url; jQuery.cachedScript( uael_url ).done(function(){ var flag = true; }); } }); }); jQuery( document ).on( "ready elementor/popup/show", () => { if ( jQuery.find( ".uael-particle-yes" ).length < 1 ) { return; } var uael_url = uael_particles_script.uael_particles_url; jQuery.cachedScript = function( url, options ) { // Allow user to set any option except for dataType, cache, and url. options = jQuery.extend( options || {}, { dataType: "script", cache: true, url: url }); // Return the jqXHR object so we can chain callbacks. return jQuery.ajax( options ); }; jQuery.cachedScript( uael_url ); }); </script> <script> /(trident|msie)/i.test(navigator.userAgent)&&document.getElementById&&window.addEventListener&&window.addEventListener("hashchange",function(){var t,e=location.hash.substring(1);/^[A-z0-9_-]+$/.test(e)&&(t=document.getElementById(e))&&(/^(?:a|select|input|button|textarea)$/i.test(t.tagName)||(t.tabIndex=-1),t.focus())},!1); </script> <script src="https://www.google.com/recaptcha/api.js?render=6LdikOAaAAAAAJ6SWrrKVQrtw7TQpQAEnv0HS0G3"></script> <script type="text/javascript"> ( function( grecaptcha ) { var anr_onloadCallback = function() { grecaptcha.execute( '6LdikOAaAAAAAJ6SWrrKVQrtw7TQpQAEnv0HS0G3', { action: 'advanced_nocaptcha_recaptcha' } ).then( function( token ) { for ( var i = 0; i < document.forms.length; i++ ) { var form = document.forms[i]; var captcha = form.querySelector( 'input[name="g-recaptcha-response"]' ); if ( null === captcha ) continue; captcha.value = token; } }); }; grecaptcha.ready( anr_onloadCallback ); document.addEventListener( 'wpcf7submit', anr_onloadCallback, false ); if ( typeof jQuery !== 'undefined' ) { //Woocommerce jQuery( document.body ).on( 'checkout_error', anr_onloadCallback ); } //token is valid for 2 minutes, So get new token every after 1 minutes 50 seconds setInterval(anr_onloadCallback, 110000); } )( grecaptcha ); </script> <script>window.lazyLoadOptions=[{elements_selector:"img[data-lazy-src],.rocket-lazyload",data_src:"lazy-src",data_srcset:"lazy-srcset",data_sizes:"lazy-sizes",class_loading:"lazyloading",class_loaded:"lazyloaded",threshold:300,callback_loaded:function(element){if(element.tagName==="IFRAME"&&element.dataset.rocketLazyload=="fitvidscompatible"){if(element.classList.contains("lazyloaded")){if(typeof window.jQuery!="undefined"){if(jQuery.fn.fitVids){jQuery(element).parent().fitVids()}}}}}},{elements_selector:".rocket-lazyload",data_src:"lazy-src",data_srcset:"lazy-srcset",data_sizes:"lazy-sizes",class_loading:"lazyloading",class_loaded:"lazyloaded",threshold:300,}];window.addEventListener('LazyLoad::Initialized',function(e){var lazyLoadInstance=e.detail.instance;if(window.MutationObserver){var observer=new MutationObserver(function(mutations){var image_count=0;var iframe_count=0;var rocketlazy_count=0;mutations.forEach(function(mutation){for(var i=0;i<mutation.addedNodes.length;i++){if(typeof mutation.addedNodes[i].getElementsByTagName!=='function'){continue} if(typeof mutation.addedNodes[i].getElementsByClassName!=='function'){continue} images=mutation.addedNodes[i].getElementsByTagName('img');is_image=mutation.addedNodes[i].tagName=="IMG";iframes=mutation.addedNodes[i].getElementsByTagName('iframe');is_iframe=mutation.addedNodes[i].tagName=="IFRAME";rocket_lazy=mutation.addedNodes[i].getElementsByClassName('rocket-lazyload');image_count+=images.length;iframe_count+=iframes.length;rocketlazy_count+=rocket_lazy.length;if(is_image){image_count+=1} if(is_iframe){iframe_count+=1}}});if(image_count>0||iframe_count>0||rocketlazy_count>0){lazyLoadInstance.update()}});var b=document.getElementsByTagName("body")[0];var config={childList:!0,subtree:!0};observer.observe(b,config)}},!1)</script><script data-no-minify="1" async src="https://www.railscarma.com/wp-content/plugins/wp-rocket/assets/js/lazyload/17.8.3/lazyload.min.js"></script> </body> </html> <!-- This website is like a Rocket, isn't it? Performance optimized by WP Rocket. Learn more: https://wp-rocket.me - Debug: cached@1736331633 -->