Lär dig grunderna i Nokogiri Gem

Världen snurrar snabbare och snabbare och denna acceleration är tydlig i alla aspekter av våra liv. Speciellt när det kommer till företag ligger premien på hastigheten. I denna frenetiska accelererade är volatiliteten den enda konstanten. För att hänga med i takten och för att ligga steget före den allt hårdare konkurrensen letar företag efter sätt att öka effektiviteten och få snabbare marknadshastighet. Detta förklarar frenesien bakom populariteten för programmeringsspråk som Ruby on Rails. Det som gör Ruby on Rails ännu mer fantastiskt är det stora antalet ädelstenar som den kommer packad med. Föreställ dig ett verktyg och du har förmodligen det i ditt Ruby-kit. En av de bästa pärlorna för Ruby on Rails är Nokogiri som är ett bibliotek för att hantera XML- och HTML-dokument. Den vanligaste användningen av en parser som Nokogiri är att extrahera data från strukturerade dokument. Exempel:

  • En lista över priser från en prisjämförelsewebbplats.
  • Sökresultatlänkar från en sökmotor.
  • En lista med svar från en Q&A-webbplats.

Installation:

OS X:

Så här installerar du libxml2 från macports:

$ sudo port installera libxml2 libxslt

Sedan för att installera nokogiri:

$ sudo gem installera nokogiri

Linux:

På Linux behöver vi fortfarande installera libxml2. Kommandot för att installera libxml2 kommer att variera beroende på pakethanteraren och Linux-distributionen vi använder.

På Fedora:

$ sudo yum installera libxml2-devel libxslt-devel

$ gem installera nokogiri

På Ubuntu:

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

$ gem installera nokogiri

Komma igång med Nokogiri:

När vi väl har installerat Nokogiri kan vi börja använda det. Nokogiri kan använda XPath- eller CSS3-väljare. Möjligheten att använda CSS-väljare gör det till en riktigt bra passform för att extrahera data från HTML-dokument.

kräver "rubygems"

kräver 'nokogiri'

kräver 'open-uri'

Förutom att kräva nokogiri gem vi skulle behöva open-uri så att innehållet i en URL lätt kan hittas. Vi skapar sedan ett nytt Nokogiri HTML-dokument och skickar det innehållet på sökresultatsidan. Med det Nokogiri-dokumentet kan vi sedan använda at_css och skicka CSS-väljaren "titel" för att hämta innehållet i element. Metoden at_css returnerar det första matchande elementet och vi kan anropa .text på det elementet för att få dess textinnehåll. Slutligen använder vi puts för att skriva ut texten.</html></p> <p><strong>Grundläggande analys:</strong></p> <p>Nokogiri låter dig analysera ett HTML- eller XML-dokument med några olika strategier:</p> <ul> <li>DOM</li> <li>SAX</li> <li>Läsare</li> <li>Dra</li> </ul> <p>Var och en av dessa strategier har olika fördelar och nackdelar. DOM-gränssnittet är det vanligaste och anses allmänt vara det enklaste att använda.</p> <p>Varje produkt som är den sista artikeln i raden har en annan klass:</p> <blockquote> <p><div class="”product" lastcol”><br><a href="/sv/”/product/f05f/”/" class="”product_link”"><br><img<br>src="/images/dot_clear.gif"<br>title=”Förstör sömnen med detta kraftfulla energiskott – i en återanvändbar hagelgevärsflaska.”<br>alt="Zombie Blast Energy Shots 3-pack"<br>width="125"<br>höjd=”125″<br>class=”lat”<br>data-original=”http://a.tgcdn.net/images/products/thumb/largesquare/f05f_zombie_blast_energy_shots.jpg”<br>/><br><h4>Zombie Blast Energy Shots 3-pack</h4><br></a><br><p>$9.99</p><br></div></p> </blockquote> <p>Detta betyder att för att få namnet på produkterna skulle vi säga:</p> <p><strong>Engelsk: </strong>Börja i roten av dokumentet: titta i varje div som har ett klassnamn som innehåller ordet 'produkt'. Där hittar du en länk. I den länken hittar du h4-text.</p> <p><strong>XPath:</strong> //div[innehåller(@klass,'produkt')]/a/h4</p> <p>XPath-likhetsoperatorn matchar bara fullständiga värden, i det här fallet en sträng. XPath matchar bara hela klassnamn så div[@class='product'] i Xpath skulle inte fungera för att få den sista kolumnen som du kan förvänta dig.</p> <p><strong>Referens:</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">Prenumerera för de senaste uppdateringarna</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="lastare" 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="lastare"></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="E-postadress"> </p> <p class="sib-NAME-area"> <label class="sib-NAME-area"></label> <input type="text" class="sib-NAME-area" name="NAME" placeholder="namn" > </p> <p> <input type="submit" class="sib-default-btn" value="Prenumerera"> </p> </div> <input type="hidden" name="trp-form-language" value="sv"/></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" >relaterade inlägg</div> <div class="post-list owl-carousel"> <div class="item"> <div class="thumb post_thumb"> <a href="https://www.railscarma.com/sv/blogg/technical-articles/dataskrapning-i-skenor-genom-att-bearbeta-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/sv/blogg/technical-articles/dataskrapning-i-skenor-genom-att-bearbeta-csv/?related_post_from=31591"> Dataskrapning i skenor genom att bearbeta CSV </a> </div> <div class="item"> <div class="thumb post_thumb"> <a href="https://www.railscarma.com/sv/blogg/technical-articles/hur-man-aterstaller-commit-fran-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/sv/blogg/technical-articles/hur-man-aterstaller-commit-fran-github/?related_post_from=31361"> Hur man återställer commit från GitHub </a> </div> <div class="item"> <div class="thumb post_thumb"> <a href="https://www.railscarma.com/sv/blogg/technical-articles/ringa-rostsamtal-genom-ruby-on-rails-webbapplikationer/?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/sv/blogg/technical-articles/ringa-rostsamtal-genom-ruby-on-rails-webbapplikationer/?related_post_from=31309"> Ring röstsamtal genom Ruby on Rails webbapplikationer </a> </div> <div class="item"> <div class="thumb post_thumb"> <a href="https://www.railscarma.com/sv/blogg/technical-articles/hur-man-importerar-export-mysql-databas-i-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/sv/blogg/technical-articles/hur-man-importerar-export-mysql-databas-i-rails/?related_post_from=31294"> Hur importerar/exporterar man MySQL-databas i 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">Om inläggsförfattare</h3> <div class="wp-post-author"> <div class="awpa-img awpa-author-block square"> <a href="https://www.railscarma.com/sv/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/sv/author/sales_jaqlr8na/">administration</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/sv/author/sales_jaqlr8na/" class="awpa-more-posts" data-no-translation="" data-trp-gettext="">Se författarens inlägg</a> </p> </div> <ul class="awpa-contact-info"> <li class="awpa-website-li"> <a href="https://www.railscarma.com/sv/hyra-ruby-on-rails-utvecklare/" 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="Inlägg" data-no-translation-aria-label=""> <h2 class="screen-reader-text" data-no-translation="" data-trp-gettext="">Inläggsnavigering</h2> <div class="nav-links"><div class="nav-previous"><a href="https://www.railscarma.com/sv/blogg/technical-articles/paginering-i-skenor-med-adelstenen-will_pagete/" rel="prev"><span class="ast-left-arrow">←</span> Föregående Inlägg</a></div><div class="nav-next"><a href="https://www.railscarma.com/sv/blogg/technical-articles/protect-your-web-application-with-google-recaptcha-on-ruby-on-rails/" rel="next">Nästa Inlägg <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">Lämna en kommentar <small><a rel="nofollow" id="cancel-comment-reply-link" href="/sv/blogg/technical-articles/lara-dig-grunderna-i-nokogiri-gem/#respond" style="display:none;" data-no-translation="" data-trp-gettext="">Avbryt svar</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="">Din e-postadress kommer inte publiceras.</span> <span class="required-field-message" data-no-translation="" data-trp-gettext="">Obligatoriska fält är märkta <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="">Skriv här..</label><textarea id="comment" name="comment" placeholder="Skriv här.." 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="">Namn*</label><input id="author" name="author" type="text" value="" placeholder="Namn*" 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-post*</label><input id="email" name="email" type="text" value="" placeholder="E-post*" 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="">Hemsida</label><input id="url" name="url" type="text" value="" placeholder="Hemsida" 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="">Spara mitt namn, min e-postadress och webbplats i denna webbläsare till nästa gång jag skriver en kommentar.</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="Publicera kommentar "" 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="sv"/></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">Prenumerera för uppdateringar</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="lastare" 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="lastare"></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="E-postadress"> </p> <p class="sib-NAME-area"> <label class="sib-NAME-area"></label> <input type="text" class="sib-NAME-area" name="NAME" placeholder="namn" > </p> <p> <input type="submit" class="sib-default-btn" value="Prenumerera"> </p> </div> <input type="hidden" name="trp-form-language" value="sv"/></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="">Senaste inläggen</h2><nav aria-label="Senaste inläggen" data-no-translation-aria-label=""> <ul> <li> <a href="https://www.railscarma.com/sv/blogg/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/sv/blogg/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/sv/blogg/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="">Kategorier</h2><nav aria-label="Kategorier" data-no-translation-aria-label=""> <ul> <li class="cat-item cat-item-385"><a href="https://www.railscarma.com/sv/kategori/blogg/management/">Artiklar om Management</a> </li> <li class="cat-item cat-item-1224"><a href="https://www.railscarma.com/sv/kategori/blogg/">Bloggar</a> </li> <li class="cat-item cat-item-596"><a href="https://www.railscarma.com/sv/kategori/blogg/hybrid-app/">hybrid app</a> </li> <li class="cat-item cat-item-517"><a href="https://www.railscarma.com/sv/kategori/blogg/industry-insights/">Branschinsikter</a> </li> <li class="cat-item cat-item-697"><a href="https://www.railscarma.com/sv/kategori/jobb/">jobb</a> </li> <li class="cat-item cat-item-598"><a href="https://www.railscarma.com/sv/kategori/blogg/mobile-app/">Mobil app</a> </li> <li class="cat-item cat-item-600"><a href="https://www.railscarma.com/sv/kategori/blogg/mobile-application-development/">utveckling av mobila applikationer</a> </li> <li class="cat-item cat-item-601"><a href="https://www.railscarma.com/sv/kategori/blogg/mobile-marketing/">mobil marknadsföring</a> </li> <li class="cat-item cat-item-602"><a href="https://www.railscarma.com/sv/kategori/blogg/native-app/">inbyggd app</a> </li> <li class="cat-item cat-item-414"><a href="https://www.railscarma.com/sv/kategori/blogg/news/">Nyheter</a> </li> <li class="cat-item cat-item-455"><a href="https://www.railscarma.com/sv/kategori/blogg/rails-3/">Räls 3</a> </li> <li class="cat-item cat-item-690"><a href="https://www.railscarma.com/sv/kategori/blogg/ror/">ROR</a> </li> <li class="cat-item cat-item-384"><a href="https://www.railscarma.com/sv/kategori/blogg/technical-articles/">Tekniska artiklar</a> </li> <li class="cat-item cat-item-1"><a href="https://www.railscarma.com/sv/kategori/blogg/uncategorized/">Okategoriserad</a> </li> <li class="cat-item cat-item-606"><a href="https://www.railscarma.com/sv/kategori/blogg/web-app-railscarma/">webbapp</a> </li> </ul> </nav></aside><aside id="media_image-2" class="widget widget_media_image"><h2 class="widget-title">Om oss</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 - Ruby on Rails Development Company specialiserat på offshoreutveckling" 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 - Ruby on Rails Development Company specialiserat på offshoreutveckling" style="max-width: 100%; height: auto;" decoding="async" /></noscript></aside><aside id="text-8" class="widget widget_text"> <div class="textwidget"><p>En av de snabbast växande teknikföretagen, RailsCarma specialiserar sig på att skapa lösningar för entreprenörer, stora organisationer, byråer och nystartade företag.</p> <p><a href="https://www.railscarma.com/sv/">Läs mer</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">Snabbnavigering</h2> <div class="textwidget"><p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/sv/om-oss/">Om oss</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/sv/why-us/">Varför oss</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/sv/vart-lag/">Vårt lag</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/sv/careers/">Karriärer</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/sv/vart-arbetsflode-for-utveckling/">Utvecklingsarbetsflöde</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/sv/technology-stack/">Teknikstapel</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/sv/agil-jarnvagsmetodik/">Agil utvecklingsmetodik</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/sv/portfolj/">Portfölj</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/sv/casestudies/">Fallstudier</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/sv/blogg/">Bloggar</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">Våra tjänster</h2> <div class="textwidget"><p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/sv/ruby-on-rails-konsultation/">Ruby On Rails Consulting</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/sv/utveckling-av-mobila-applikationer/">Utveckling av mobilappar</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/sv/hyra-ruby-on-rails-utvecklare/">Hyr Ruby on Rails-utvecklare</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/sv/tjanster-for-produktutveckling/">Produktutvecklingstjänster</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/sv/utveckling-av-spree-handel/">Spree Commerce Development</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/sv/utveckling-av-saas-applikationer/">SaaS applikationsutveckling</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/sv/anpassade-skenor-applikationsutveckling/">ROR applikationsutveckling</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/sv/mvp-development/">MVP-utveckling</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/sv/devops-services/">DevOps-tjänst</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/sv/cloud-hosting-and-migration/">Cloud Hosting & Migration</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/sv/api-driven-utveckling-och-mashups/">API-driven utveckling</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/sv/tjansteleverantor-for-uppgradering-av-skenor/">Rails Upgrade Service</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/sv/support-och-underhall-av-applikationer/">Appsupport och underhåll</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/sv/utvecklingsforetag-med-medelhog-stack/">MEAN Stack utveckling</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/sv/ui-ux-designtjanster-foretag/">UI UX Design Services</a></p> <p><a href="https://www.railscarma.com/sv/tjanster-for-utveckling-av-mern-stack/">MERN Stack Development</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">Kontaktinformation</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 ( USA )</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">förbi</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% ansedd</span> <span class="surly__subtitle">Utveckling </span> <span class="surly__subtitle">Företag</span> </span> <span class="surly__text" style="font-size:12px ! important;">Hemsida</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/sv/ruby-on-rails-utvecklingsforetag-i-dubai-uae/"> Dubai, Förenade Arabemiraten</a><span class="tooltiptext">PO Box 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/sv/ruby-rails-utveckling-konsultverksamhet-kalifornien/">Kalifornien, USA</a><span class="tooltiptext">515 S, Flower Street 36th Floor, Los Angeles, Kalifornien, 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/sv/ruby-on-rails-utvecklingskonsult-new-york/">New York, USA</a><span class="tooltiptext">172 5th Ave Suite 49 Brooklyn, New York 11217, USA</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/sv/ruby-on-rails-utveckling-konsulttjanster-dallas/">Dalla, USA</a><span class="tooltiptext">3333 Lee Parkway, Ste 600, Dallas, TX 75219 US</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/sv/ruby-rails-utveckling-konsultation-doha-qatar/">Doha, Qatar</a><span class="tooltiptext">Al EZZ Tower, 2:a våningen, byggnad nr. 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/sv/ruby-on-rails-utvecklingskonsult-i-bangalore/">Bangalore, Indien</a><span class="tooltiptext">#27, Ambalipura, Bellandur, Bangalore 560103, Indien.</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" > Upphovsrätt © 2024 - 2025 <a href="https://www.railscarma.com/sv/" title="Ruby On Rails Development Company">RailsCarma.</a> Alla rättigheter förbehållna. Designad av <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/sv/integritetspolicy/">Integritetspolicy. </a><a href="https://www.railscarma.com/sv/villkor/">Villkor.</a><a href="https://www.railscarma.com/sv/sitemap/"> Webbplatskarta</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="sv_SE"></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">Vi använder cookies på vår webbplats för att ge dig den mest relevanta upplevelsen genom att komma ihåg dina preferenser och upprepade besök. Genom att klicka på "ACCEPTERA ALLA" samtycker du till användningen av ALLA cookies. Du kan dock besöka "Cookieinställningar" för att ge ett kontrollerat samtycke.</div><div class="cli-bar-btn_container"> <a role='button' class="cli_settings_button" style="margin:0px 10px 0px 5px">Cookie-inställningar</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">AVVISA ALLA</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">ACCEPTERAR ALLA</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="">Hantera samtycke</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="">Stänga</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>Sekretessöversikt</h4> <div class="cli-privacy-content"> <div class="cli-privacy-content-text">Denna webbplats använder cookies för att förbättra din upplevelse när du navigerar genom webbplatsen. Av dessa lagras de cookies som kategoriseras som nödvändiga i din webbläsare eftersom de är nödvändiga för att de grundläggande funktionerna på webbplatsen ska fungera. Vi använder även tredjepartscookies som hjälper oss att analysera och förstå hur du använder denna webbplats. Dessa cookies kommer endast att lagras i din webbläsare med ditt samtycke. Du har också möjlighet att välja bort dessa cookies. Men att välja bort vissa av dessa cookies kan påverka din surfupplevelse.</div> </div> <a class="cli-privacy-readmore" aria-label="Visa mer" tabindex="0" role="button" data-readmore-text="Visa mer" data-readless-text="Visa mindre" 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"> Nödvändig </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">Nödvändig</label> </div> <span class="cli-necessary-caption" data-no-translation="" data-trp-gettext="">Alltid aktiverad</span> </div> <div class="cli-tab-content"> <div class="cli-tab-pane cli-fade" data-id="necessary"> <p>Nödvändiga cookies är absolut nödvändiga för att webbplatsen ska fungera korrekt. Dessa cookies säkerställer grundläggande funktioner och säkerhetsfunktioner på webbplatsen, anonymt. <table class="cookielawinfo-row-cat-table cookielawinfo-winter"><thead><tr><th class="cookielawinfo-column-1" data-no-translation="" data-trp-gettext="">Kaka</th><th class="cookielawinfo-column-3" data-no-translation="" data-trp-gettext="">Varaktighet</th><th class="cookielawinfo-column-4" data-no-translation="" data-trp-gettext="">Beskrivning</th></tr></thead><tbody><tr class="cookielawinfo-row"><td class="cookielawinfo-column-1">cookielawinfo-checkbox-analytics</td><td class="cookielawinfo-column-3">11 månader</td><td class="cookielawinfo-column-4">Denna cookie ställs in av GDPR Cookie Consent-plugin. Cookien används för att lagra användarens samtycke för cookies i kategorin "Analytics".</td></tr><tr class="cookielawinfo-row"><td class="cookielawinfo-column-1">cookielawinfo-checkbox-functional</td><td class="cookielawinfo-column-3">11 månader</td><td class="cookielawinfo-column-4">Cookien sätts av GDPR-cookie-samtycke för att registrera användarens samtycke för cookies i kategorin "Funktionell".</td></tr><tr class="cookielawinfo-row"><td class="cookielawinfo-column-1">cookielawinfo-checkbox-necessary</td><td class="cookielawinfo-column-3">11 månader</td><td class="cookielawinfo-column-4">Denna cookie ställs in av GDPR Cookie Consent-plugin. Cookies används för att lagra användarens samtycke för cookies i kategorin "Nödvändigt".</td></tr><tr class="cookielawinfo-row"><td class="cookielawinfo-column-1">cookielawinfo-checkbox-others</td><td class="cookielawinfo-column-3">11 månader</td><td class="cookielawinfo-column-4">Denna cookie ställs in av GDPR Cookie Consent-plugin. Cookien används för att lagra användarens samtycke för cookies i kategorin "Övrigt.</td></tr><tr class="cookielawinfo-row"><td class="cookielawinfo-column-1">cookielawinfo-checkbox-performance</td><td class="cookielawinfo-column-3">11 månader</td><td class="cookielawinfo-column-4">Denna cookie ställs in av GDPR Cookie Consent-plugin. Cookien används för att lagra användarens samtycke för cookies i kategorin "Prestanda".</td></tr><tr class="cookielawinfo-row"><td class="cookielawinfo-column-1">viewed_cookie_policy</td><td class="cookielawinfo-column-3">11 månader</td><td class="cookielawinfo-column-4">Cookien ställs in av GDPR Cookie Consent-plugin och används för att lagra om användaren har samtyckt till användningen av cookies eller inte. Den lagrar inga personuppgifter.</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"> Funktionell </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="Aktiverad" data-cli-disable="Inaktiverad" data-no-translation-data-cli-enable="" data-no-translation-data-cli-disable=""><span class="wt-cli-sr-only">Funktionell</span></label> </div> </div> <div class="cli-tab-content"> <div class="cli-tab-pane cli-fade" data-id="functional"> <p>Funktionella cookies hjälper till att utföra vissa funktioner som att dela innehållet på webbplatsen på sociala medieplattformar, samla in feedback och andra tredjepartsfunktioner. </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"> Prestanda </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="Aktiverad" data-cli-disable="Inaktiverad" data-no-translation-data-cli-enable="" data-no-translation-data-cli-disable=""><span class="wt-cli-sr-only">Prestanda</span></label> </div> </div> <div class="cli-tab-content"> <div class="cli-tab-pane cli-fade" data-id="performance"> <p>Prestandacookies används för att förstå och analysera webbplatsens nyckelprestandaindex, vilket hjälper till att leverera en bättre användarupplevelse för besökarna. </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"> Analytics </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="Aktiverad" data-cli-disable="Inaktiverad" data-no-translation-data-cli-enable="" data-no-translation-data-cli-disable=""><span class="wt-cli-sr-only">Analytics</span></label> </div> </div> <div class="cli-tab-content"> <div class="cli-tab-pane cli-fade" data-id="analytics"> <p>Analytiska cookies används för att förstå hur besökare interagerar med webbplatsen. Dessa cookies hjälper till att ge information om mätvärden för antalet besökare, avvisningsfrekvens, trafikkälla, etc. </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"> Annons </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="Aktiverad" data-cli-disable="Inaktiverad" data-no-translation-data-cli-enable="" data-no-translation-data-cli-disable=""><span class="wt-cli-sr-only">Annons</span></label> </div> </div> <div class="cli-tab-content"> <div class="cli-tab-pane cli-fade" data-id="advertisement"> <p>Annonscookies används för att ge besökarna relevanta annonser och marknadsföringskampanjer. Dessa cookies spårar besökare över webbplatser och samlar in information för att tillhandahålla anpassade annonser. </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"> Andra </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="Aktiverad" data-cli-disable="Inaktiverad" data-no-translation-data-cli-enable="" data-no-translation-data-cli-disable=""><span class="wt-cli-sr-only">Andra</span></label> </div> </div> <div class="cli-tab-content"> <div class="cli-tab-pane cli-fade" data-id="others"> <p>Andra okategoriserade cookies är de som analyseras och som ännu inte har klassificerats i en kategori. </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="">SPARA & ACCEPTERA</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="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> </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/it/blog/technical-articles/imparare-i-fondamenti-della-gemma-nokogiri/" title="Italian"> <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> <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="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></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="">WhatsApp oss</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":"Hall\u00e5","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":"sv_SE","trp_original_language":"en_US","trp_current_language":"sv_SE","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":"Hall\u00e5","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\/sv\/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":"\/sv(\/(?:.+\/)?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\/sv","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":"Dela p\u00e5 Facebook","shareOnTwitter":"Dela p\u00e5 Twitter","pinIt":"F\u00e4st den","download":"Ladda ner","downloadImage":"Ladda ner bild","fullscreen":"Fullsk\u00e4rm","zoom":"Zoom","share":"Dela med sig","playVideo":"Spela filmen","previous":"Tidigare","next":"N\u00e4sta","close":"St\u00e4nga","a11yCarouselWrapperAriaLabel":"Karusell | Horisontell rullning: pil v\u00e4nster och h\u00f6ger","a11yCarouselPrevSlideMessage":"F\u00f6reg\u00e5ende bild","a11yCarouselNextSlideMessage":"N\u00e4sta bild","a11yCarouselFirstSlideMessage":"Detta \u00e4r f\u00f6rsta bilden","a11yCarouselLastSlideMessage":"Detta \u00e4r sista bilden","a11yCarouselPaginationBulletMessage":"G\u00e5 till bild"},"is_rtl":false,"breakpoints":{"xs":0,"sm":480,"md":768,"lg":1025,"xl":1440,"xxl":1600},"responsive":{"breakpoints":{"mobile":{"label":"Mobilt portr\u00e4ttl\u00e4ge","value":767,"default_value":767,"direction":"max","is_enabled":true},"mobile_extra":{"label":"Mobil liggande","value":880,"default_value":880,"direction":"max","is_enabled":false},"tablet":{"label":"St\u00e5ende p\u00e5 l\u00e4splatta","value":1024,"default_value":1024,"direction":"max","is_enabled":true},"tablet_extra":{"label":"Liggande p\u00e5 l\u00e4splatta","value":1200,"default_value":1200,"direction":"max","is_enabled":false},"laptop":{"label":"B\u00e4rbar dator","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@1736329332 -->