Apprendre les principes fondamentaux de Nokogiri Gem

Le monde tourne de plus en plus vite et cette accélération est évidente dans toutes les facettes de nos vies. Surtout lorsqu’il s’agit d’entreprises, la priorité est à la vitesse. Dans cette frénésie accélérée, la volatilité est la seule constante. Pour suivre le rythme et garder une longueur d’avance face à une concurrence de plus en plus féroce, les entreprises recherchent des moyens d’accroître leur efficacité et d’accélérer leur mise sur le marché. Cela explique la frénésie derrière la popularité des langages de programmation comme Ruby on Rails. Ce qui rend Ruby on Rails encore plus étonnant, c'est le grand nombre de joyaux qui le contiennent. Imaginez un outil et vous l'avez probablement dans votre kit Ruby. L'un des meilleurs joyaux de Ruby on Rails est Nokogiri, une bibliothèque permettant de gérer les documents XML et HTML. L'utilisation la plus courante d'un analyseur comme Nokogiri est d'extraire des données de documents structurés. Exemples:

  • Une liste de prix provenant d'un site Web de comparaison de prix.
  • Liens de résultats de recherche à partir d’un moteur de recherche.
  • Une liste de réponses provenant d'un site de questions-réponses.

Installation:

OS X :

Pour installer libxml2 depuis macports :

$ port sudo installer libxml2 libxslt

Puis pour installer nokogiri :

$ sudo gem installer nokogiri

Linux :

Sous Linux, nous devons toujours installer libxml2. La commande d'installation de libxml2 varie en fonction du gestionnaire de packages et de la distribution Linux que nous utilisons.

Sur Fedora :

$ sudo yum install libxml2-devel libxslt-devel

Gemme $ installer Nokogiri

Sur Ubuntu :

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

Gemme $ installer Nokogiri

Premiers pas avec Nokogiri :

Une fois Nokogiri installé, nous pouvons commencer à l'utiliser. Nokogiri peut utiliser des sélecteurs XPath ou CSS3. La possibilité d'utiliser des sélecteurs CSS en fait un très bon choix pour extraire des données à partir de documents HTML.

nécessite des « rubygems »

nécessite 'nokogiri'

nécessite 'open-uri'

En plus d'exiger la gemme nokogiri, nous aurions besoin d'open-uri pour que le contenu d'une URL puisse être facilement trouvé. Nous créons ensuite un nouveau document HTML Nokogiri et lui transmettons le contenu de la page de résultats de recherche. Avec ce document Nokogiri, nous pouvons ensuite utiliser at_css, en passant le sélecteur CSS « title » pour récupérer le contenu du élément. La méthode at_css renverra le premier élément correspondant et nous pourrons appeler .text sur cet élément pour obtenir son contenu textuel. Enfin nous utilisons puts pour imprimer le texte.</html></p> <p><strong>Analyse de base :</strong></p> <p>Nokogiri vous permet d'analyser un document HTML ou XML en utilisant différentes stratégies :</p> <ul> <li>DOMAINE</li> <li>SAXO</li> <li>Lecteur</li> <li>Tirer</li> </ul> <p>Chacune de ces stratégies présente des avantages et des inconvénients différents. L'interface DOM est la plus courante et généralement considérée comme la plus simple à utiliser.</p> <p>Chaque produit qui est le dernier élément d’une rangée a une classe différente :</p> <blockquote> <p><div class="”product" lastcol”><br><a href="/fr/”/product/f05f/”/" class="”product_link”"><br><img<br>src="/images/dot_clear.gif"<br>title=”Détruisez le sommeil avec cette puissante dose d’énergie – dans une bouteille de cartouche de fusil de chasse réutilisable.”<br>alt = "Pack de 3 tirs énergétiques Zombie Blast"<br>largeur=”125″<br>hauteur=”125″<br>classe = "paresseux"<br>data-original = "http://a.tgcdn.net/images/products/thumb/largesquare/f05f_zombie_blast_energy_shots.jpg"<br>/><br><h4>Pack de 3 tirs d&#039;énergie Zombie Blast</h4><br></a><br><p>$9.99</p><br></div></p> </blockquote> <p>Cela signifie que pour obtenir le nom des produits, nous dirions :</p> <p><strong>Anglais: </strong>En commençant à la racine du document : recherchez dans chaque div qui a un nom de classe contenant le mot « produit ». À l’intérieur, trouvez un lien. Dans ce lien, trouvez le texte h4.</p> <p><strong>XPath :</strong> //div[contient (@class,'product')]/a/h4</p> <p>L'opérateur d'égalité XPath correspond uniquement aux valeurs complètes, dans ce cas une chaîne. XPath ne correspond qu'aux noms de classes entières, donc div[@class='product'] dans XPath ne fonctionnerait pas pour obtenir la dernière colonne comme on pourrait s'y attendre.</p> <p><strong>Référence:</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">Abonnez-vous pour les dernières mises à jour</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="f5103992fa"> <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="Adresse e-mail"> </p> <p class="sib-NAME-area"> <label class="sib-NAME-area"></label> <input type="text" class="sib-NAME-area" name="NAME" placeholder="Nom" > </p> <p> <input type="submit" class="sib-default-btn" value="S'abonner"> </p> </div> <input type="hidden" name="trp-form-language" value="fr"/></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" >Articles Similaires</div> <div class="post-list owl-carousel"> <div class="item"> <div class="thumb post_thumb"> <a href="https://www.railscarma.com/fr/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/fr/blog/technical-articles/data-scraping-in-rails-by-processing-csv/?related_post_from=31591"> Récupération de données dans Rails en traitant CSV </a> </div> <div class="item"> <div class="thumb post_thumb"> <a href="https://www.railscarma.com/fr/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/fr/blog/technical-articles/how-to-revert-commit-from-github/?related_post_from=31361"> Comment annuler la validation depuis GitHub </a> </div> <div class="item"> <div class="thumb post_thumb"> <a href="https://www.railscarma.com/fr/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/fr/blog/technical-articles/make-voice-calls-through-ruby-on-rails-web-applications/?related_post_from=31309"> Passer des appels vocaux via les applications Web Ruby on Rails </a> </div> <div class="item"> <div class="thumb post_thumb"> <a href="https://www.railscarma.com/fr/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/fr/blog/technical-articles/how-to-import-export-mysql-database-in-rails/?related_post_from=31294"> Comment importer/exporter une base de données MySQL dans 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">À propos de l'auteur du message</h3> <div class="wp-post-author"> <div class="awpa-img awpa-author-block square"> <a href="https://www.railscarma.com/fr/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/fr/author/sales_jaqlr8na/">administrateur</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/fr/author/sales_jaqlr8na/" class="awpa-more-posts" data-no-translation="" data-trp-gettext="">Voir les messages de l'auteur</a> </p> </div> <ul class="awpa-contact-info"> <li class="awpa-website-li"> <a href="https://www.railscarma.com/fr/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="Publications" data-no-translation-aria-label=""> <h2 class="screen-reader-text" data-no-translation="" data-trp-gettext="">Navigation de l’article</h2> <div class="nav-links"><div class="nav-previous"><a href="https://www.railscarma.com/fr/blog/technical-articles/pagination-in-rails-with-the-will_paginate-gem/" rel="prev"><span class="ast-left-arrow">←</span> Précédent Article</a></div><div class="nav-next"><a href="https://www.railscarma.com/fr/blog/technical-articles/protect-your-web-application-with-google-recaptcha-on-ruby-on-rails/" rel="next">Suivant Article <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">Laissez un commentaire <small><a rel="nofollow" id="cancel-comment-reply-link" href="/fr/blog/technical-articles/learning-the-fundamentals-of-nokogiri-gem/#respond" style="display:none;" data-no-translation="" data-trp-gettext="">Annuler la réponse</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="">Votre adresse de messagerie ne sera pas publiée.</span> <span class="required-field-message" data-no-translation="" data-trp-gettext="">Les champs obligatoires sont indiqués avec <span class="required">*</span></span></p><div class="ast-row comment-textarea"><fieldset class="comment-form-comment"><div class="comment-form-textarea ast-col-lg-12"><label for="comment" class="screen-reader-text" data-no-translation="" data-trp-gettext="">Écrivez ici..</label><textarea id="comment" name="comment" placeholder="Écrivez ici.." 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="">Nom*</label><input id="author" name="author" type="text" value="" placeholder="Nom*" size="30" aria-required='true' data-no-translation-placeholder="" /></p> <p class="comment-form-email ast-col-xs-12 ast-col-sm-12 ast-col-md-4 ast-col-lg-4"><label for="email" class="screen-reader-text" data-no-translation="" data-trp-gettext="">E-mail*</label><input id="email" name="email" type="text" value="" placeholder="E-mail*" size="30" aria-required='true' data-no-translation-placeholder="" /></p> <p class="comment-form-url ast-col-xs-12 ast-col-sm-12 ast-col-md-4 ast-col-lg-4"><label for="url"><label for="url" class="screen-reader-text" data-no-translation="" data-trp-gettext="">Site web</label><input id="url" name="url" type="text" value="" placeholder="Site web" size="30" data-no-translation-placeholder="" /></label></p></div> <p class="comment-form-cookies-consent"><input id="wp-comment-cookies-consent" name="wp-comment-cookies-consent" type="checkbox" value="yes" /> <label for="wp-comment-cookies-consent" data-no-translation="" data-trp-gettext="">Enregistrer mon nom, mon e-mail et mon site web dans le navigateur pour mon prochain commentaire.</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="Poster un commentaire "" 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="fr"/></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">Abonnez-vous pour les mises à jour</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="f5103992fa"> <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="Adresse e-mail"> </p> <p class="sib-NAME-area"> <label class="sib-NAME-area"></label> <input type="text" class="sib-NAME-area" name="NAME" placeholder="Nom" > </p> <p> <input type="submit" class="sib-default-btn" value="S'abonner"> </p> </div> <input type="hidden" name="trp-form-language" value="fr"/></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="">Articles récents</h2><nav aria-label="Articles récents" data-no-translation-aria-label=""> <ul> <li> <a href="https://www.railscarma.com/fr/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/fr/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/fr/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="">Catégories</h2><nav aria-label="Catégories" data-no-translation-aria-label=""> <ul> <li class="cat-item cat-item-385"><a href="https://www.railscarma.com/fr/category/blog/management/">Articles sur la gestion</a> </li> <li class="cat-item cat-item-1224"><a href="https://www.railscarma.com/fr/category/blog/">Blogues</a> </li> <li class="cat-item cat-item-596"><a href="https://www.railscarma.com/fr/category/blog/hybrid-app/">application hybride</a> </li> <li class="cat-item cat-item-517"><a href="https://www.railscarma.com/fr/category/blog/industry-insights/">Aperçu de l'industrie</a> </li> <li class="cat-item cat-item-697"><a href="https://www.railscarma.com/fr/category/jobs/">emplois</a> </li> <li class="cat-item cat-item-598"><a href="https://www.railscarma.com/fr/category/blog/mobile-app/">Application mobile</a> </li> <li class="cat-item cat-item-600"><a href="https://www.railscarma.com/fr/category/blog/mobile-application-development/">développement d'applications mobiles</a> </li> <li class="cat-item cat-item-601"><a href="https://www.railscarma.com/fr/category/blog/mobile-marketing/">Marketing mobile</a> </li> <li class="cat-item cat-item-602"><a href="https://www.railscarma.com/fr/category/blog/native-app/">application native</a> </li> <li class="cat-item cat-item-414"><a href="https://www.railscarma.com/fr/category/blog/news/">Nouvelles</a> </li> <li class="cat-item cat-item-455"><a href="https://www.railscarma.com/fr/category/blog/rails-3/">Rails 3</a> </li> <li class="cat-item cat-item-690"><a href="https://www.railscarma.com/fr/category/blog/ror/">ROR</a> </li> <li class="cat-item cat-item-384"><a href="https://www.railscarma.com/fr/category/blog/technical-articles/">Articles techniques</a> </li> <li class="cat-item cat-item-1"><a href="https://www.railscarma.com/fr/category/blog/uncategorized/">Non classé</a> </li> <li class="cat-item cat-item-606"><a href="https://www.railscarma.com/fr/category/blog/web-app-railscarma/">application Web</a> </li> </ul> </nav></aside><aside id="media_image-2" class="widget widget_media_image"><h2 class="widget-title">À propos de nous</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>RailsCarma, l'une des entreprises technologiques à la croissance la plus rapide, se spécialise dans la création de solutions pour les entrepreneurs, les grandes organisations, les agences et les start-ups.</p> <p><a href="https://www.railscarma.com/fr/">En savoir plus</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">Navigation Rapide</h2> <div class="textwidget"><p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/fr/about-us/">À propos de nous</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/fr/why-us/">Pourquoi nous</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/fr/our-team/">Notre équipe</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/fr/careers/">Carrières</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/fr/our-development-workflow/">Flux de travail de développement</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/fr/technology-stack/">Pile technologique</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/fr/agile-rails-methodology/">Méthodologie de développement agile</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/fr/portfolio/">Portefeuille</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/fr/casestudies/">Études de cas</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/fr/blog/">Blogues</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">Nos services</h2> <div class="textwidget"><p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/fr/ruby-on-rails-consulting/">Conseil Ruby On Rails</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/fr/mobile-application-development/">Développement d'applications mobiles</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/fr/hire-ruby-on-rails-developer/">Embaucher un développeur Ruby on Rails</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/fr/product-development-services/">Services de développement de produits</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/fr/spree-commerce-development/">Développement du commerce de folie</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/fr/saas-application-development/">Développement d'applications SaaS</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/fr/custom-rails-application-development/">Développement d'applications ROR</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/fr/mvp-development/">Développement MVP</a></p> </div> </div> </div> <div class="ast-col-lg-3 ast-col-md-3 ast-col-sm-12 ast-col-xs-12 footer-adv-widget footer-adv-widget-3" > <div id="text-9" class="widget widget_text"> <div class="textwidget"><h2 style="margin-bottom: 60px;"></h2> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/fr/devops-services/">Service DevOps</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/fr/cloud-hosting-and-migration/">Hébergement et migration cloud</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/fr/api-driven-development-and-mashups/">Développement piloté par API</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/fr/rails-upgrade-service-provider/">Service de mise à niveau des rails</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/fr/application-support-and-maintenance/">Support et maintenance des applications</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/fr/mean-stack-development-company/">Développement de la pile MEAN</a></p> <p style="margin-bottom: .2em;"><a href="https://www.railscarma.com/fr/ui-ux-design-services-company/">Services de conception UI UX</a></p> <p><a href="https://www.railscarma.com/fr/mern-stack-development-services/">Développement de la pile MERN</a></p> </div> </div> </div> <div class="ast-col-lg-3 ast-col-md-3 ast-col-sm-12 ast-col-xs-12 footer-adv-widget footer-adv-widget-4" > <div id="text-6" class="widget widget_text"><h2 class="widget-title">Informations de contact</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 (États-Unis)</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">par</span> <span>bourru</span></a> </div> <div class="surly__content"> <span style="font-size:12px ! important;" class="surly__title surly__title_r3"> <span class="surly__subtitle">100% Réputé</span> <span class="surly__subtitle">Développement </span> <span class="surly__subtitle">Entreprise</span> </span> <span class="surly__text" style="font-size:12px ! important;">Site web</span> <span class="surly__date" style="font-size:14px ! important;">2021</span> </div> </div></div></div> </div> </div><!-- .ast-row --> <div class="footlocations"> <div class="tooltip"><picture class="alignnone size-full wp-image-33204" style="margin-right: 10px;"> <source type="image/webp" data-lazy-srcset="https://www.railscarma.com/wp-content/uploads/2021/09/DXB.png.webp" srcset="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2030%2020'%3E%3C/svg%3E"/> <img src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2030%2020'%3E%3C/svg%3E" alt="" width="30" height="20" data-lazy-src="https://www.railscarma.com/wp-content/uploads/2021/09/DXB.png"/> </picture> <noscript><picture class="alignnone size-full wp-image-33204" style="margin-right: 10px;"> <source type="image/webp" srcset="https://www.railscarma.com/wp-content/uploads/2021/09/DXB.png.webp"/> <img src="https://www.railscarma.com/wp-content/uploads/2021/09/DXB.png" alt="" width="30" height="20"/> </picture> </noscript><a href="https://www.railscarma.com/fr/ruby-on-rails-development-company-in-dubai-uae/"> Dubaï, Emirats Arabes Unis</a><span class="tooltiptext">PO Box 390 667, Centre d'affaires, Dubai World Central, Dubaï</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/fr/ruby-rails-development-consulting-california/">Californie, États-Unis</a><span class="tooltiptext">515 S, Flower Street 36e étage, Los Angeles, Californie, 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/fr/ruby-on-rails-development-consulting-new-york/">New York, États-Unis</a><span class="tooltiptext">172 5th Ave, Suite 49 Brooklyn, New York 11217, États-Unis</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/fr/ruby-on-rails-development-consulting-dallas/">Dallas, États-Unis</a><span class="tooltiptext">3333 Lee Parkway, Ste 600, Dallas, TX 75219 États-Unis</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/fr/ruby-rails-development-consulting-doha-qatar/">Doha, Qatar</a><span class="tooltiptext">Tour Al EZZ, 2e étage, bâtiment n° 84, rue Al Aaliya, Doha-Qatar</span></div>   <div class="tooltip"><picture class="alignnone size-full wp-image-803" style="margin-right: 10px;"> <source type="image/webp" data-lazy-srcset="https://www.railscarma.com/wp-content/uploads/2021/09/india.jpg.webp" srcset="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2030%2020'%3E%3C/svg%3E"/> <img src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2030%2020'%3E%3C/svg%3E" alt="" width="30" height="20" data-lazy-src="https://www.railscarma.com/wp-content/uploads/2021/09/india.jpg"/> </picture> <noscript><picture class="alignnone size-full wp-image-803" style="margin-right: 10px;"> <source type="image/webp" srcset="https://www.railscarma.com/wp-content/uploads/2021/09/india.jpg.webp"/> <img src="https://www.railscarma.com/wp-content/uploads/2021/09/india.jpg" alt="" width="30" height="20"/> </picture> </noscript><a href="https://www.railscarma.com/fr/ruby-on-rails-development-consulting-in-bangalore/">Bangalore, Inde</a><span class="tooltiptext">#27, Ambalipura, Bellandur, Bangalore 560103, Inde.</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/fr/" title="Société de développement Ruby On Rails">RailsCarma.</a> Tous droits réservés. Conçu par <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/fr/privacy-policy/">Politique de confidentialité. </a><a href="https://www.railscarma.com/fr/terms-of-use/">Conditions d'utilisation.</a><a href="https://www.railscarma.com/fr/sitemap/"> Plan du site</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="fr_FR"></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">Nous utilisons des cookies sur notre site Web pour vous offrir l'expérience la plus pertinente en mémorisant vos préférences et vos visites répétées. En cliquant sur « ACCEPTER TOUT », vous consentez à l’utilisation de TOUS les cookies. Cependant, vous pouvez visiter « Paramètres des cookies » pour fournir un consentement contrôlé.</div><div class="cli-bar-btn_container"> <a role='button' class="cli_settings_button" style="margin:0px 10px 0px 5px">Paramètres des cookies</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">REJETER TOUT</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">ACCEPTER TOUT</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="">Gérer le consentement</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="">Fermer</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>Aperçu de la confidentialité</h4> <div class="cli-privacy-content"> <div class="cli-privacy-content-text">Ce site Web utilise des cookies pour améliorer votre expérience lorsque vous naviguez sur le site Web. Parmi ceux-ci, les cookies classés comme nécessaires sont stockés sur votre navigateur car ils sont essentiels au fonctionnement des fonctionnalités de base du site Web. Nous utilisons également des cookies tiers qui nous aident à analyser et à comprendre comment vous utilisez ce site Web. Ces cookies ne seront stockés dans votre navigateur qu'avec votre consentement. Vous avez également la possibilité de refuser ces cookies. Mais la désactivation de certains de ces cookies peut affecter votre expérience de navigation.</div> </div> <a class="cli-privacy-readmore" aria-label="Montre plus" tabindex="0" role="button" data-readmore-text="Montre plus" data-readless-text="Montrer moins" data-no-translation-aria-label="" data-no-translation-data-readmore-text="" data-no-translation-data-readless-text=""></a> </div> </div> <div class="cli-col-12 cli-align-items-stretch cli-px-0 cli-tab-section-container"> <div class="cli-tab-section"> <div class="cli-tab-header"> <a role="button" tabindex="0" class="cli-nav-link cli-settings-mobile" data-target="necessary" data-toggle="cli-toggle-tab"> Nécessaire </a> <div class="wt-cli-necessary-checkbox"> <input type="checkbox" class="cli-user-preference-checkbox" id="wt-cli-checkbox-necessary" data-id="checkbox-necessary" checked="checked" /> <label class="form-check-label" for="wt-cli-checkbox-necessary">Nécessaire</label> </div> <span class="cli-necessary-caption" data-no-translation="" data-trp-gettext="">Toujours activé</span> </div> <div class="cli-tab-content"> <div class="cli-tab-pane cli-fade" data-id="necessary"> <p>Les cookies nécessaires sont absolument essentiels au bon fonctionnement du site Web. Ces cookies assurent les fonctionnalités de base et les éléments de sécurité du site Web, de manière anonyme. <table class="cookielawinfo-row-cat-table cookielawinfo-winter"><thead><tr><th class="cookielawinfo-column-1" data-no-translation="" data-trp-gettext="">Biscuit</th><th class="cookielawinfo-column-3" data-no-translation="" data-trp-gettext="">Durée</th><th class="cookielawinfo-column-4" data-no-translation="" data-trp-gettext="">Description</th></tr></thead><tbody><tr class="cookielawinfo-row"><td class="cookielawinfo-column-1">cookielawinfo-checkbox-analytics</td><td class="cookielawinfo-column-3">11 mois</td><td class="cookielawinfo-column-4">Ce cookie est défini par le plugin GDPR Cookie Consent. Le cookie est utilisé pour stocker le consentement de l'utilisateur pour les cookies de la catégorie « Analytics ».</td></tr><tr class="cookielawinfo-row"><td class="cookielawinfo-column-1">cookielawinfo-checkbox-fonctionnel</td><td class="cookielawinfo-column-3">11 mois</td><td class="cookielawinfo-column-4">Le cookie est défini par le consentement aux cookies du RGPD pour enregistrer le consentement de l'utilisateur pour les cookies de la catégorie « Fonctionnel ».</td></tr><tr class="cookielawinfo-row"><td class="cookielawinfo-column-1">cookielawinfo-case à cocher-nécessaire</td><td class="cookielawinfo-column-3">11 mois</td><td class="cookielawinfo-column-4">Ce cookie est défini par le plugin GDPR Cookie Consent. Les cookies sont utilisés pour stocker le consentement de l'utilisateur pour les cookies dans la catégorie « Nécessaire ».</td></tr><tr class="cookielawinfo-row"><td class="cookielawinfo-column-1">cookielawinfo-checkbox-autres</td><td class="cookielawinfo-column-3">11 mois</td><td class="cookielawinfo-column-4">Ce cookie est défini par le plugin GDPR Cookie Consent. Le cookie est utilisé pour stocker le consentement de l'utilisateur pour les cookies de la catégorie "Autre".</td></tr><tr class="cookielawinfo-row"><td class="cookielawinfo-column-1">cookielawinfo-checkbox-performance</td><td class="cookielawinfo-column-3">11 mois</td><td class="cookielawinfo-column-4">Ce cookie est défini par le plugin GDPR Cookie Consent. Le cookie est utilisé pour stocker le consentement de l'utilisateur pour les cookies de la catégorie « Performance ».</td></tr><tr class="cookielawinfo-row"><td class="cookielawinfo-column-1">visualisé_cookie_policy</td><td class="cookielawinfo-column-3">11 mois</td><td class="cookielawinfo-column-4">Le cookie est défini par le plugin GDPR Cookie Consent et est utilisé pour stocker si l'utilisateur a consenti ou non à l'utilisation de cookies. Il ne stocke aucune donnée personnelle.</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"> Fonctionnel </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="Activé" data-cli-disable="Désactivé" data-no-translation-data-cli-enable="" data-no-translation-data-cli-disable=""><span class="wt-cli-sr-only">Fonctionnel</span></label> </div> </div> <div class="cli-tab-content"> <div class="cli-tab-pane cli-fade" data-id="functional"> <p>Les cookies fonctionnels aident à exécuter certaines fonctionnalités telles que le partage du contenu du site Web sur les plateformes de médias sociaux, la collecte de commentaires et d'autres fonctionnalités tierces. </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"> Performance </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="Activé" data-cli-disable="Désactivé" data-no-translation-data-cli-enable="" data-no-translation-data-cli-disable=""><span class="wt-cli-sr-only">Performance</span></label> </div> </div> <div class="cli-tab-content"> <div class="cli-tab-pane cli-fade" data-id="performance"> <p>Les cookies de performance sont utilisés pour comprendre et analyser les principaux indices de performance du site Web, ce qui contribue à offrir une meilleure expérience utilisateur aux visiteurs. </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"> Analytique </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="Activé" data-cli-disable="Désactivé" data-no-translation-data-cli-enable="" data-no-translation-data-cli-disable=""><span class="wt-cli-sr-only">Analytique</span></label> </div> </div> <div class="cli-tab-content"> <div class="cli-tab-pane cli-fade" data-id="analytics"> <p>Les cookies analytiques sont utilisés pour comprendre comment les visiteurs interagissent avec le site Web. Ces cookies aident à fournir des informations sur les mesures telles que le nombre de visiteurs, le taux de rebond, la source du trafic, etc. </p> </div> </div> </div> <div class="cli-tab-section"> <div class="cli-tab-header"> <a role="button" tabindex="0" class="cli-nav-link cli-settings-mobile" data-target="advertisement" data-toggle="cli-toggle-tab"> Publicité </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="Activé" data-cli-disable="Désactivé" data-no-translation-data-cli-enable="" data-no-translation-data-cli-disable=""><span class="wt-cli-sr-only">Publicité</span></label> </div> </div> <div class="cli-tab-content"> <div class="cli-tab-pane cli-fade" data-id="advertisement"> <p>Les cookies publicitaires sont utilisés pour fournir aux visiteurs des publicités et des campagnes marketing pertinentes. Ces cookies suivent les visiteurs sur les sites Web et collectent des informations pour proposer des publicités personnalisées. </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"> Autres </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="Activé" data-cli-disable="Désactivé" data-no-translation-data-cli-enable="" data-no-translation-data-cli-disable=""><span class="wt-cli-sr-only">Autres</span></label> </div> </div> <div class="cli-tab-content"> <div class="cli-tab-pane cli-fade" data-id="others"> <p>Les autres cookies non classés sont ceux qui sont en cours d'analyse et qui n'ont pas encore été classés dans une catégorie. </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="">ENREGISTRER ET ACCEPTER</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="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> </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/de/blog/technical-articles/learning-the-fundamentals-of-nokogiri-gem/" title="German"> <img class="trp-flag-image" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2018%2012'%3E%3C/svg%3E" width="18" height="12" alt="de_DE" title="German" data-lazy-src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/de_DE.png"><noscript><img class="trp-flag-image" src="https://www.railscarma.com/wp-content/plugins/translatepress-multilingual/assets/images/flags/de_DE.png" width="18" height="12" alt="de_DE" title="German"></noscript>German </a> <a href="https://www.railscarma.com/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="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></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 nous</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":"Bonjour","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":"fr_FR","trp_original_language":"en_US","trp_current_language":"fr_FR","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":"7cdffc5ae0","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":"Bonjour","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\/fr\/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":"\/fr(\/(?:.+\/)?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\/fr","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":"Partager sur Facebook","shareOnTwitter":"Partager sur Twitter","pinIt":"\u00c9pinglez-le","download":"T\u00e9l\u00e9charger","downloadImage":"T\u00e9l\u00e9charger l'image","fullscreen":"Plein \u00e9cran","zoom":"Zoom","share":"Partager","playVideo":"Lire la vid\u00e9o","previous":"Pr\u00e9c\u00e9dent","next":"Suivant","close":"Fermer","a11yCarouselWrapperAriaLabel":"Carousel | Scroll horizontal: Fl\u00e8che gauche & droite","a11yCarouselPrevSlideMessage":"Diapositive pr\u00e9c\u00e9dente","a11yCarouselNextSlideMessage":"Diapositive suivante","a11yCarouselFirstSlideMessage":"Ceci est la premi\u00e8re diapositive","a11yCarouselLastSlideMessage":"Ceci est la derni\u00e8re diapositive","a11yCarouselPaginationBulletMessage":"Aller \u00e0 la diapositive"},"is_rtl":false,"breakpoints":{"xs":0,"sm":480,"md":768,"lg":1025,"xl":1440,"xxl":1600},"responsive":{"breakpoints":{"mobile":{"label":"Portrait mobile","value":767,"default_value":767,"direction":"max","is_enabled":true},"mobile_extra":{"label":"Mobile Paysage","value":880,"default_value":880,"direction":"max","is_enabled":false},"tablet":{"label":"Tablette en mode portrait","value":1024,"default_value":1024,"direction":"max","is_enabled":true},"tablet_extra":{"label":"Tablette en mode paysage","value":1200,"default_value":1200,"direction":"max","is_enabled":false},"laptop":{"label":"Portable","value":1366,"default_value":1366,"direction":"max","is_enabled":false},"widescreen":{"label":"\u00c9cran large","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@1732251717 -->