Erlernen der Grundlagen von Nokogiri Gem

Die Welt dreht sich immer schneller und diese Beschleunigung zeigt sich in allen Facetten unseres Lebens. Gerade bei Unternehmen kommt es auf die Geschwindigkeit an. In dieser hektischen Beschleunigung ist die Volatilität die einzige Konstante. Um mit dem Tempo Schritt zu halten und dem immer härter werdenden Wettbewerb einen Schritt voraus zu sein, suchen Unternehmen nach Möglichkeiten, die Effizienz zu steigern und die Markteinführungsgeschwindigkeit zu beschleunigen. Dies erklärt die Hektik hinter der Popularität von Programmiersprachen wie Ruby on Rails. Was Ruby on Rails noch erstaunlicher macht, ist die schiere Menge an Edelsteinen, mit denen es ausgestattet ist. Stellen Sie sich ein Werkzeug vor und höchstwahrscheinlich haben Sie es in Ihrem Ruby-Kit. Eines der besten Juwelen für Ruby on Rails ist Nokogiri, eine Bibliothek für den Umgang mit XML- und HTML-Dokumenten. Der häufigste Einsatzzweck eines Parsers wie Nokogiri ist das Extrahieren von Daten aus strukturierten Dokumenten. Beispiele:

  • Eine Preisliste von einer Preisvergleichswebsite.
  • Suchergebnisse-Links einer Suchmaschine.
  • Eine Liste mit Antworten von einer Q&A-Site.

Installation:

OS X:

So installieren Sie libxml2 über Macports:

$ Sudo-Port installiert libxml2 libxslt

Dann installieren Sie Nokogiri:

$ sudo gem install nokogiri

Linux:

Unter Linux müssen wir noch libxml2 installieren. Der Befehl zum Installieren von libxml2 variiert je nach verwendetem Paketmanager und Linux-Distribution.

Auf Fedora:

$ sudo yum install libxml2-devel libxslt-devel

$ Gem Nokogiri installieren

Auf Ubuntu:

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

$ Gem Nokogiri installieren

Erste Schritte mit Nokogiri:

Sobald wir Nokogiri installiert haben, können wir damit beginnen, es zu nutzen. Nokogiri kann XPath- oder CSS3-Selektoren verwenden. Durch die Möglichkeit, CSS-Selektoren zu verwenden, eignet es sich wirklich gut zum Extrahieren von Daten aus HTML-Dokumenten.

benötige 'Rubygems'

benötige 'nokogiri'

erfordern 'open-uri'

Zusätzlich zum Nokogiri-Juwel benötigen wir open-uri, damit der Inhalt einer URL leicht gefunden werden kann. Anschließend erstellen wir ein neues Nokogiri-HTML-Dokument und übergeben ihm den Inhalt der Suchergebnisseite. Mit diesem Nokogiri-Dokument können wir dann at_css verwenden und den CSS-Selektor „title“ übergeben, um den Inhalt abzurufen Element. Die at_css-Methode gibt das erste passende Element zurück und wir können .text für dieses Element aufrufen, um seinen Textinhalt abzurufen. Schließlich verwenden wir Puts, um den Text auszudrucken.</html></p> <p><strong>Grundlegendes Parsen:</strong></p> <p>Mit Nokogiri können Sie ein HTML- oder XML-Dokument mithilfe verschiedener Strategien analysieren:</p> <ul> <li>DOM</li> <li>SAXOPHON</li> <li>Leser</li> <li>Ziehen</li> </ul> <p>Jede dieser Strategien hat unterschiedliche Vor- und Nachteile. Die DOM-Schnittstelle ist die gebräuchlichste und wird allgemein als die am einfachsten zu verwendende angesehen.</p> <p>Jedes Produkt, das das letzte Element in einer Reihe ist, hat eine andere Klasse:</p> <blockquote> <p><div class="”product" lastcol”><br><a href="/de/”/product/f05f/”/" class="”product_link”"><br><img<br>src=“/images/dot_clear.gif“<br>title=“Zerstören Sie den Schlaf mit diesem kraftvollen Energieschuss – in einer wiederverwendbaren Schrotpatronenflasche.“<br>alt=“Zombie Blast Energy Shots 3er-Pack“<br>Breite=“125″<br>Höhe = „125“<br>class=“faul“<br>data-original=“http://a.tgcdn.net/images/products/thumb/largesquare/f05f_zombie_blast_energy_shots.jpg“<br>/><br><h4>Zombie Blast Energy Shots 3er-Pack</h4><br></a><br><p>$9.99</p><br></div></p> </blockquote> <p>Das heißt, um den Namen der Produkte zu erfahren, würden wir sagen:</p> <p><strong>Englisch: </strong>Beginnen Sie im Stammverzeichnis des Dokuments: Suchen Sie in jedem Div, das einen Klassennamen hat, der das Wort „Produkt“ enthält. Darin finden Sie einen Link. In diesem Link finden Sie den h4-Text.</p> <p><strong>XPath:</strong> //div[contains(@class,'product')]/a/h4</p> <p>Der XPath-Gleichheitsoperator gleicht nur vollständige Werte ab, in diesem Fall eine Zeichenfolge. XPath stimmt nur mit ganzen Klassennamen überein, daher würde div[@class='product'] in Xpath nicht wie erwartet funktionieren, um die letzte Spalte abzurufen.</p> <p><strong>Referenz:</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">Abonnieren Sie die neuesten Updates</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" action=""> <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="loader" 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="loader"></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="faa90f5b8c"> <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-Mail-Adresse"> </p> <p class="sib-NAME-area"> <label class="sib-NAME-area"></label> <input type="text" class="sib-NAME-area" name="NAME" placeholder="Name" > </p> <p> <input type="submit" class="sib-default-btn" value="Abonnieren"> </p> </div> <input type="hidden" name="trp-form-language" value="de"/></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" >zusammenhängende Posts</div> <div class="post-list owl-carousel"> <div class="item"> <div class="thumb post_thumb"> <a href="https://www.railscarma.com/de/blog/technical-articles/data-scraping-in-rails-by-processing-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/de/blog/technical-articles/data-scraping-in-rails-by-processing-csv/?related_post_from=31591"> Daten-Scraping in Rails durch Verarbeitung von CSV </a> </div> <div class="item"> <div class="thumb post_thumb"> <a href="https://www.railscarma.com/de/blog/technical-articles/how-to-revert-commit-from-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/de/blog/technical-articles/how-to-revert-commit-from-github/?related_post_from=31361"> So setzen Sie das Commit von GitHub zurück </a> </div> <div class="item"> <div class="thumb post_thumb"> <a href="https://www.railscarma.com/de/blog/technical-articles/make-voice-calls-through-ruby-on-rails-web-applications/?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/de/blog/technical-articles/make-voice-calls-through-ruby-on-rails-web-applications/?related_post_from=31309"> Führen Sie Sprachanrufe über Ruby on Rails-Webanwendungen durch </a> </div> <div class="item"> <div class="thumb post_thumb"> <a href="https://www.railscarma.com/de/blog/technical-articles/how-to-import-export-mysql-database-in-rails/?related_post_from=31294"> <picture decoding="async" class="attachment-full size-full wp-post-image"> <source type="image/webp" data-lazy-srcset="https://www.railscarma.com/wp-content/uploads/2020/07/How-To-Import-or-Export-MySQL-Database-in-Rails.jpg.webp 744w, https://www.railscarma.com/wp-content/uploads/2020/07/How-To-Import-or-Export-MySQL-Database-in-Rails-300x113.jpg.webp 300w" srcset="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20744%20279'%3E%3C/svg%3E" data-lazy-sizes="(max-width: 744px) 100vw, 744px"/> <img decoding="async" width="744" height="279" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20744%20279'%3E%3C/svg%3E" alt="" data-lazy-srcset="https://www.railscarma.com/wp-content/uploads/2020/07/How-To-Import-or-Export-MySQL-Database-in-Rails.jpg 744w, https://www.railscarma.com/wp-content/uploads/2020/07/How-To-Import-or-Export-MySQL-Database-in-Rails-300x113.jpg 300w" data-lazy-sizes="(max-width: 744px) 100vw, 744px" data-lazy-src="https://www.railscarma.com/wp-content/uploads/2020/07/How-To-Import-or-Export-MySQL-Database-in-Rails.jpg"/> </picture> <noscript><picture loading="lazy" decoding="async" class="attachment-full size-full wp-post-image"> <source type="image/webp" srcset="https://www.railscarma.com/wp-content/uploads/2020/07/How-To-Import-or-Export-MySQL-Database-in-Rails.jpg.webp 744w, https://www.railscarma.com/wp-content/uploads/2020/07/How-To-Import-or-Export-MySQL-Database-in-Rails-300x113.jpg.webp 300w" sizes="(max-width: 744px) 100vw, 744px"/> <img loading="lazy" decoding="async" width="744" height="279" src="https://www.railscarma.com/wp-content/uploads/2020/07/How-To-Import-or-Export-MySQL-Database-in-Rails.jpg" alt="" srcset="https://www.railscarma.com/wp-content/uploads/2020/07/How-To-Import-or-Export-MySQL-Database-in-Rails.jpg 744w, https://www.railscarma.com/wp-content/uploads/2020/07/How-To-Import-or-Export-MySQL-Database-in-Rails-300x113.jpg 300w" sizes="(max-width: 744px) 100vw, 744px"/> </picture> </noscript> </a> </div> <a class="title post_title" href="https://www.railscarma.com/de/blog/technical-articles/how-to-import-export-mysql-database-in-rails/?related_post_from=31294"> Wie importiert/exportiert man eine MySQL-Datenbank in Rails? </a> </div> </div> <script> </script> <style > .related-post{} .related-post .post-list{ text-align:left; } .related-post .post-list .item{ margin:10px; padding:10px; } .related-post .headline{ font-size:14px !important; color:#999999 !important; } .related-post .post-list .item .post_thumb{ max-height:220px; margin:10px 0px; padding:0px; display: block; } .related-post .post-list .item .post_title{ font-size:14px; color:#000000; margin:10px 0px; padding:0px; display: block; text-decoration: none; } .related-post .post-list .item .post_excerpt{ font-size:12px; color:#3f3f3f; margin:10px 0px; padding:0px; display: block; text-decoration: none; } .related-post .owl-dots .owl-dot { } </style> <script> jQuery(document).ready(function($){ $(".related-post .post-list").owlCarousel({ items :2, responsiveClass:true, responsive:{ 0:{ items:1, }, 768:{ items:2, }, 1200:{ items:2, } }, rewind: true, loop: true, center: false, autoplay: true, autoplayHoverPause: true, nav: true, navSpeed: 1000, navText : ['<i class="fas fa-chevron-left"></i>','<i class="fas fa-chevron-right"></i>'], dots: false, dotsSpeed: 1200, rtl: false, }); }); </script> </div> <div class="wp-post-author-wrap wp-post-author-shortcode left"> <h3 class="awpa-title">Über den Autor des Beitrags</h3> <div class="wp-post-author"> <div class="awpa-img awpa-author-block square"> <a href="https://www.railscarma.com/de/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/de/author/sales_jaqlr8na/">Administrator</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/de/author/sales_jaqlr8na/" class="awpa-more-posts" data-no-translation="" data-trp-gettext="">Siehe Beiträge des Autors</a> </p> </div> <ul class="awpa-contact-info"> <li class="awpa-website-li"> <a href="https://www.railscarma.com/de/hire-ruby-on-rails-developer/" 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="Beiträge" data-no-translation-aria-label=""> <h2 class="screen-reader-text" data-no-translation="" data-trp-gettext="">Beitrags-Navigation</h2> <div class="nav-links"><div class="nav-previous"><a href="https://www.railscarma.com/de/blog/technical-articles/pagination-in-rails-with-the-will_paginate-gem/" rel="prev"><span class="ast-left-arrow">←</span> Vorheriges Beitrag</a></div><div class="nav-next"><a href="https://www.railscarma.com/de/blog/technical-articles/protect-your-web-application-with-google-recaptcha-on-ruby-on-rails/" rel="next">Nächster Beitrag <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">Hinterlasse einen Kommentar <small><a rel="nofollow" id="cancel-comment-reply-link" href="/de/blog/technical-articles/learning-the-fundamentals-of-nokogiri-gem/#respond" style="display:none;" data-no-translation="" data-trp-gettext="">Antwort verwerfen</a></small></h3><form action="https://www.railscarma.com/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="">Deine E-Mail-Adresse wird nicht veröffentlicht.</span> <span class="required-field-message" data-no-translation="" data-trp-gettext="">Erforderliche Felder sind mit <span class="required">*</span> markiert</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="">Geben Sie hier ein..</label><textarea id="comment" name="comment" placeholder="Geben Sie hier ein.." 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="">Name*</label><input id="author" name="author" type="text" value="" placeholder="Name*" 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="">Email*</label><input id="email" name="email" type="text" value="" placeholder="Email*" 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="">Webseite</label><input id="url" name="url" type="text" value="" placeholder="Webseite" 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="">Meinen Namen, meine E-Mail-Adresse und meine Website in diesem Browser für die nächste Kommentierung speichern.</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="Kommentar hinzufügen "" 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="de"/></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">Abonnieren Sie Updates</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" action=""> <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="loader" 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="loader"></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="faa90f5b8c"> <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-Mail-Adresse"> </p> <p class="sib-NAME-area"> <label class="sib-NAME-area"></label> <input type="text" class="sib-NAME-area" name="NAME" placeholder="Name" > </p> <p> <input type="submit" class="sib-default-btn" value="Abonnieren"> </p> </div> <input type="hidden" name="trp-form-language" value="de"/></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="">Neueste Beiträge</h2><nav aria-label="Neueste Beiträge" data-no-translation-aria-label=""> <ul> <li> <a href="https://www.railscarma.com/de/blog/the-beginners-guide-to-ruby-case-statement/">The Beginner’s Guide to Ruby Case Statement</a> </li> <li> <a href="https://www.railscarma.com/de/blog/mastering-ruby-heredocs-simplify-your-code-with-multi-line-strings/">Mastering Ruby Heredocs: Simplify Your Code with Multi-Line Strings</a> </li> <li> <a href="https://www.railscarma.com/de/blog/top-20-applications-of-artificial-intelligence-ai/">Top 20 Applications of Artificial Intelligence (AI) 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="">Kategorien</h2><nav aria-label="Kategorien" data-no-translation-aria-label=""> <ul> <li class="cat-item cat-item-385"><a href="https://www.railscarma.com/de/category/blog/management/">Artikel zum Thema Management</a> </li> <li class="cat-item cat-item-1224"><a href="https://www.railscarma.com/de/category/blog/">Blogs</a> </li> <li class="cat-item cat-item-596"><a href="https://www.railscarma.com/de/category/blog/hybrid-app/">Hybrid-App</a> </li> <li class="cat-item cat-item-517"><a href="https://www.railscarma.com/de/category/blog/industry-insights/">Brancheneinblicke</a> </li> <li class="cat-item cat-item-697"><a href="https://www.railscarma.com/de/category/jobs/">Arbeitsplätze</a> </li> <li class="cat-item cat-item-598"><a href="https://www.railscarma.com/de/category/blog/mobile-app/">App</a> </li> <li class="cat-item cat-item-600"><a href="https://www.railscarma.com/de/category/blog/mobile-application-development/">Entwicklung mobiler Anwendungen</a> </li> <li class="cat-item cat-item-601"><a href="https://www.railscarma.com/de/category/blog/mobile-marketing/">mobiles Marketing</a> </li> <li class="cat-item cat-item-602"><a href="https://www.railscarma.com/de/category/blog/native-app/">native App</a> </li> <li class="cat-item cat-item-414"><a href="https://www.railscarma.com/de/category/blog/news/">Nachricht</a> </li> <li class="cat-item cat-item-455"><a href="https://www.railscarma.com/de/category/blog/rails-3/">Schienen 3</a> </li> <li class="cat-item cat-item-690"><a href="https://www.railscarma.com/de/category/blog/ror/">ROR</a> </li> <li class="cat-item cat-item-384"><a href="https://www.railscarma.com/de/category/blog/technical-articles/">Technische Artikel</a> </li> <li class="cat-item cat-item-1"><a href="https://www.railscarma.com/de/category/blog/uncategorized/">Nicht kategorisiert</a> </li> <li class="cat-item cat-item-606"><a href="https://www.railscarma.com/de/category/blog/web-app-railscarma/">Web-App</a> </li> </ul> </nav></aside><aside id="media_image-2" class="widget widget_media_image"><h2 class="widget-title">Über uns</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 Specializing in Offshore Development" 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 Specializing in Offshore Development" style="max-width: 100%; height: auto;" decoding="async" /></noscript></aside><aside id="text-8" class="widget widget_text"> <div class="textwidget"><p>Als eines der am schnellsten wachsenden Technologieunternehmen ist RailsCarma auf die Entwicklung von Lösungen für Unternehmer, große Organisationen, Agenturen und Start-ups spezialisiert.</p> <p><a href="https://www.railscarma.com/de/">Mehr lesen</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">Schnelle Navigation</h2> <div class="textwidget"><p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/de/about-us/">Über uns</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/de/why-us/">Warum wir</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/de/our-team/">Unser Team</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/de/careers/">Karriere</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/de/our-development-workflow/">Entwicklungsworkflow</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/de/technology-stack/">Technologie-Stack</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/de/agile-rails-methodology/">Agile Entwicklungsmethodik</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/de/portfolio/">Portfolio</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/de/casestudies/">Fallstudien</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/de/blog/">Blogs</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">Unsere Dienstleistungen</h2> <div class="textwidget"><p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/de/ruby-on-rails-consulting/">Ruby On Rails-Beratung</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/de/mobile-application-development/">Entwicklung mobiler Apps</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/de/hire-ruby-on-rails-developer/">Stellen Sie Ruby on Rails-Entwickler ein</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/de/product-development-services/">Produktentwicklungsdienstleistungen</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/de/spree-commerce-development/">Spree-Handelsentwicklung</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/de/saas-application-development/">SaaS-Anwendungsentwicklung</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/de/custom-rails-application-development/">ROR-Anwendungsentwicklung</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/de/mvp-development/">MVP-Entwicklung</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/de/devops-services/">DevOps-Dienst</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/de/cloud-hosting-and-migration/">Cloud-Hosting und Migration</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/de/api-driven-development-and-mashups/">API-gesteuerte Entwicklung</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/de/rails-upgrade-service-provider/">Rails-Upgrade-Service</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/de/application-support-and-maintenance/">App-Support und -Wartung</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/de/mean-stack-development-company/">MEAN-Stack-Entwicklung</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/de/ui-ux-design-services-company/">UI-UX-Designdienste</a></p> <p><a href="https://www.railscarma.com/de/mern-stack-development-services/">MERN-Stack-Entwicklung</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">von</span> <span>mürrisch</span></a> </div> <div class="surly__content"> <span style="font-size:12px ! important;" class="surly__title surly__title_r3"> <span class="surly__subtitle">100% Seriös</span> <span class="surly__subtitle">Entwicklung </span> <span class="surly__subtitle">Unternehmen</span> </span> <span class="surly__text" style="font-size:12px ! important;">Webseite</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/de/ruby-on-rails-development-company-in-dubai-uae/"> Dubai, Vereinigte Arabische Emirate</a><span class="tooltiptext">Postfach 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/de/ruby-rails-development-consulting-california/">Kalifornien, USA</a><span class="tooltiptext">515 S, Flower Street 36. Stock, 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/de/ruby-on-rails-development-consulting-new-york/">New York, USA</a><span class="tooltiptext">172 5th Ave Suite 49 Brooklyn, New York 11217, Vereinigte Staaten</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/de/ruby-on-rails-development-consulting-dallas/">Dalla, USA</a><span class="tooltiptext">3333 Lee Parkway, Ste 600, Dallas, TX 75219 USA</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/de/ruby-rails-development-consulting-doha-qatar/">Doha, Katar</a><span class="tooltiptext">Al EZZ Tower, 2. Etage, Gebäude Nr. 84, Al Aaliya Street, Doha-Katar</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/de/ruby-on-rails-development-consulting-in-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" > Copyright © 2024 - 2025 <a href="https://www.railscarma.com/de/" title="Ruby On Rails-Entwicklungsunternehmen">SchienenCarma.</a> Alle Rechte vorbehalten. Entworfen von <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/de/privacy-policy/">Datenschutzrichtlinie. </a><a href="https://www.railscarma.com/de/terms-of-use/">Nutzungsbedingungen.</a><a href="https://www.railscarma.com/de/sitemap/"> Seitenverzeichnis</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="de_DE"></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">Wir verwenden Cookies auf unserer Website, um Ihnen ein möglichst relevantes Erlebnis zu bieten, indem wir uns an Ihre Präferenzen und wiederholten Besuche erinnern. Indem Sie auf „ALLE AKZEPTIEREN“ klicken, stimmen Sie der Verwendung ALLER Cookies zu. Sie können jedoch die „Cookie-Einstellungen“ aufrufen, um eine kontrollierte Einwilligung zu erteilen.</div><div class="cli-bar-btn_container"> <a role='button' class="cli_settings_button" style="margin:0px 10px 0px 5px">Cookie-Einstellungen</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">ALLES ABLEHNEN</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">ALLE AKZEPTIEREN</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="">Einwilligung verwalten</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="">Schließen</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>Datenschutzübersicht</h4> <div class="cli-privacy-content"> <div class="cli-privacy-content-text">Diese Website verwendet Cookies, um Ihr Erlebnis beim Navigieren durch die Website zu verbessern. Von diesen werden die als notwendig kategorisierten Cookies in Ihrem Browser gespeichert, da sie für das Funktionieren der Grundfunktionen der Website unerlässlich sind. Wir verwenden auch Cookies von Drittanbietern, die uns dabei helfen, zu analysieren und zu verstehen, wie Sie diese Website nutzen. Diese Cookies werden nur mit Ihrer Einwilligung in Ihrem Browser gespeichert. Sie haben auch die Möglichkeit, diese Cookies abzulehnen. Die Ablehnung einiger dieser Cookies kann sich jedoch auf Ihr Surferlebnis auswirken.</div> </div> <a class="cli-privacy-readmore" aria-label="Zeig mehr" tabindex="0" role="button" data-readmore-text="Zeig mehr" data-readless-text="Zeige weniger" 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"> Notwendig </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">Notwendig</label> </div> <span class="cli-necessary-caption" data-no-translation="" data-trp-gettext="">Immer aktiviert</span> </div> <div class="cli-tab-content"> <div class="cli-tab-pane cli-fade" data-id="necessary"> <p>Notwendige Cookies sind für die ordnungsgemäße Funktion der Website unbedingt erforderlich. Diese Cookies stellen anonym grundlegende Funktionalitäten und Sicherheitsmerkmale der Website sicher. <table class="cookielawinfo-row-cat-table cookielawinfo-winter"><thead><tr><th class="cookielawinfo-column-1" data-no-translation="" data-trp-gettext="">Plätzchen</th><th class="cookielawinfo-column-3" data-no-translation="" data-trp-gettext="">Dauer</th><th class="cookielawinfo-column-4" data-no-translation="" data-trp-gettext="">Beschreibung</th></tr></thead><tbody><tr class="cookielawinfo-row"><td class="cookielawinfo-column-1">cookielawinfo-checkbox-analytics</td><td class="cookielawinfo-column-3">11 Monate</td><td class="cookielawinfo-column-4">Dieses Cookie wird vom DSGVO-Cookie-Zustimmungs-Plugin gesetzt. Das Cookie dient zur Speicherung der Nutzereinwilligung für die Cookies der Kategorie „Analytics“.</td></tr><tr class="cookielawinfo-row"><td class="cookielawinfo-column-1">cookielawinfo-checkbox-funktional</td><td class="cookielawinfo-column-3">11 Monate</td><td class="cookielawinfo-column-4">Das Cookie wird durch die DSGVO-Cookie-Zustimmung gesetzt, um die Zustimmung des Benutzers für die Cookies in der Kategorie „Funktional“ aufzuzeichnen.</td></tr><tr class="cookielawinfo-row"><td class="cookielawinfo-column-1">cookielawinfo-checkbox-notwendig</td><td class="cookielawinfo-column-3">11 Monate</td><td class="cookielawinfo-column-4">Dieses Cookie wird vom DSGVO-Cookie-Zustimmungs-Plugin gesetzt. Die Cookies werden verwendet, um die Zustimmung des Benutzers für die Cookies in der Kategorie „Notwendig“ zu speichern.</td></tr><tr class="cookielawinfo-row"><td class="cookielawinfo-column-1">cookielawinfo-checkbox-others</td><td class="cookielawinfo-column-3">11 Monate</td><td class="cookielawinfo-column-4">Dieses Cookie wird vom DSGVO-Cookie-Zustimmungs-Plugin gesetzt. Das Cookie wird verwendet, um die Einwilligung des Nutzers für die Cookies in der Kategorie „Sonstige“ zu speichern.</td></tr><tr class="cookielawinfo-row"><td class="cookielawinfo-column-1">cookielawinfo-checkbox-performance</td><td class="cookielawinfo-column-3">11 Monate</td><td class="cookielawinfo-column-4">Dieses Cookie wird vom DSGVO-Cookie-Zustimmungs-Plugin gesetzt. Das Cookie dient zur Speicherung der Nutzereinwilligung für die Cookies der Kategorie „Leistung“.</td></tr><tr class="cookielawinfo-row"><td class="cookielawinfo-column-1">angesehene_cookie_policy</td><td class="cookielawinfo-column-3">11 Monate</td><td class="cookielawinfo-column-4">Das Cookie wird vom DSGVO-Plugin „Cookie Consent“ gesetzt und dient dazu, zu speichern, ob der Benutzer der Verwendung von Cookies zugestimmt hat oder nicht. Es werden keine personenbezogenen Daten gespeichert.</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"> Funktional </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="Ermöglicht" data-cli-disable="Deaktiviert" data-no-translation-data-cli-enable="" data-no-translation-data-cli-disable=""><span class="wt-cli-sr-only">Funktional</span></label> </div> </div> <div class="cli-tab-content"> <div class="cli-tab-pane cli-fade" data-id="functional"> <p>Funktionale Cookies helfen dabei, bestimmte Funktionen auszuführen, wie z. B. das Teilen des Inhalts der Website auf Social-Media-Plattformen, das Sammeln von Feedback und andere Funktionen von Drittanbietern. </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"> Leistung </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="Ermöglicht" data-cli-disable="Deaktiviert" data-no-translation-data-cli-enable="" data-no-translation-data-cli-disable=""><span class="wt-cli-sr-only">Leistung</span></label> </div> </div> <div class="cli-tab-content"> <div class="cli-tab-pane cli-fade" data-id="performance"> <p>Leistungscookies werden verwendet, um die wichtigsten Leistungsindizes der Website zu verstehen und zu analysieren, was dazu beiträgt, den Besuchern ein besseres Benutzererlebnis zu bieten. </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"> Analytik </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="Ermöglicht" data-cli-disable="Deaktiviert" data-no-translation-data-cli-enable="" data-no-translation-data-cli-disable=""><span class="wt-cli-sr-only">Analytik</span></label> </div> </div> <div class="cli-tab-content"> <div class="cli-tab-pane cli-fade" data-id="analytics"> <p>Analytische Cookies werden verwendet, um zu verstehen, wie Besucher mit der Website interagieren. Diese Cookies helfen dabei, Informationen über Metriken wie Anzahl der Besucher, Absprungrate, Verkehrsquelle usw. bereitzustellen. </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"> Werbung </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="Ermöglicht" data-cli-disable="Deaktiviert" data-no-translation-data-cli-enable="" data-no-translation-data-cli-disable=""><span class="wt-cli-sr-only">Werbung</span></label> </div> </div> <div class="cli-tab-content"> <div class="cli-tab-pane cli-fade" data-id="advertisement"> <p>Werbe-Cookies werden verwendet, um Besuchern relevante Anzeigen und Marketingkampagnen bereitzustellen. Diese Cookies verfolgen Besucher über Websites hinweg und sammeln Informationen, um maßgeschneiderte Anzeigen bereitzustellen. </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"> Andere </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="Ermöglicht" data-cli-disable="Deaktiviert" data-no-translation-data-cli-enable="" data-no-translation-data-cli-disable=""><span class="wt-cli-sr-only">Andere</span></label> </div> </div> <div class="cli-tab-content"> <div class="cli-tab-pane cli-fade" data-id="others"> <p>Andere nicht kategorisierte Cookies sind solche, die analysiert werden und noch keiner Kategorie zugeordnet wurden. </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="">SPEICHERN & AKZEPTIEREN</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="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> </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/blog/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/fr/blog/technical-articles/learning-the-fundamentals-of-nokogiri-gem/" 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="#" 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="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></div> </div> </div> <!-- 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 uns</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":"Hallo","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":"de_DE","trp_original_language":"en_US","trp_current_language":"de_DE","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}},"trp_attributes_accessors":["outertext","innertext","src","value","placeholder","title","href","aria-label"],"gettranslationsnonceregular":"3954b76bbc","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.7.1" 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":"Hallo","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\/de\/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":"\/de(\/(?:.+\/)?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\/de","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":"Auf Facebook teilen","shareOnTwitter":"Auf Twitter teilen","pinIt":"Pin es","download":"Herunterladen","downloadImage":"Bild herunterladen","fullscreen":"Ganzer Bildschirm","zoom":"Zoomen","share":"Aktie","playVideo":"Video abspielen","previous":"Vorherige","next":"N\u00e4chste","close":"Schlie\u00dfen","a11yCarouselWrapperAriaLabel":"Carousel | Horizontal scrolling: Arrow Left & Right","a11yCarouselPrevSlideMessage":"Previous slide","a11yCarouselNextSlideMessage":"Next slide","a11yCarouselFirstSlideMessage":"This is the first slide","a11yCarouselLastSlideMessage":"This is the last slide","a11yCarouselPaginationBulletMessage":"Go to slide"},"is_rtl":false,"breakpoints":{"xs":0,"sm":480,"md":768,"lg":1025,"xl":1440,"xxl":1600},"responsive":{"breakpoints":{"mobile":{"label":"Mobile Portrait","value":767,"default_value":767,"direction":"max","is_enabled":true},"mobile_extra":{"label":"Mobile Landscape","value":880,"default_value":880,"direction":"max","is_enabled":false},"tablet":{"label":"Tablet Portrait","value":1024,"default_value":1024,"direction":"max","is_enabled":true},"tablet_extra":{"label":"Tablet Landscape","value":1200,"default_value":1200,"direction":"max","is_enabled":false},"laptop":{"label":"Laptop","value":1366,"default_value":1366,"direction":"max","is_enabled":false},"widescreen":{"label":"Breitbild","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@1732210810 -->