Creuser dans les rails 4

Rails 4 approche rapidement. Dans cet article, examinons certaines des nouvelles fonctionnalités qu’il offre, ainsi que les modifications susceptibles d’affecter vos applications actuelles..


Un peu de comptabilité

Les digests en cache sont la solution de Rails 4 pour suivre les modifications des modèles en cache agressifs.

Plusieurs changements de configuration et de structure sont fournis avec Rails 4..

Rubis> = 1.9.3

Rails 4 ne supportera que Ruby 1.9.3+. Préparez-vous pour une mise à niveau si ce n'est déjà fait.

Threadsafe par défaut

Par défaut, Rails 4 est sûr pour les threads, ce qui élimine les frais généraux et améliore les performances sur les serveurs threadés, tels que thin et puma. Vous devez vous assurer que votre application (et ses dépendances) sont thread-safe, ce qui signifie généralement d'éviter tout état global (par exemple, des variables de classe ou globales)..

Aaron Patterson a écrit et parlé de ce sujet. Vérifiez certainement ceux-ci!

Pas plus fournisseur / plugins

Rails 3 a eu l'idée d'utiliser des pierres précieuses pour ajouter une fonctionnalité personnalisée à Rails et a déconseillé l'utilisation de plug-ins. Rails 4 termine cette transition en supprimant le fournisseur / plugins répertoire tout à fait.

Nouveaux répertoires de test

Le schéma de nommage du répertoire de test par défaut est plus clair que dans Rails 3.

Les répertoires suivants vont maintenant être générés: test / modèles, test / aides, test / contrôleurs, test / mailers, et test / intégration.

Exécutables

le scénario répertoire a été supprimé en faveur d'un nouveau poubelle annuaire. C’est là que les exécutables de votre application vivront et fonctionneront. rake rails: mise à jour: bin va mettre paquet, râteau, et des rails binstubs dans votre application poubelle annuaire.

Cette modification peut être utile en développement, en particulier sur une machine dotée de plusieurs versions et joyaux de Ruby. Vous pouvez utiliser bac / rails au lieu de bundle exec rails pour vous assurer d'exécuter vos exécutables dans le bon environnement.


Paramètres forts

Rails 4 s'attaque au problème de l'affectation de masse avec le nouveau gem Strong Parameters. Une application Rails 3 peut avoir un créer action similaire à l'exemple suivant:

 classe UsersController < ApplicationController def create @user = User.create(params[:user]) #… check validity, redirect, etc. end end

Vous pouvez vous protéger contre les entrées inattendues avec des déclarations dans le modèle:

 classe utilisateur < ActiveRecord::Base # Only allow the following attributes to be mass-assigned attr_accessible :name, :email end

À l'aide des paramètres forts de Rails 4, la gem déplace les entrées de l'utilisateur dans le contrôleur:

 classe UsersController < ApplicationController def create @user = User.create(user_params) #… check validity, redirect, etc. end def user_params params.require(:user).permit(:name, :email) end end

Comme vous pouvez le voir, le params Le hachage dans votre contrôleur n'est pas un hachage normal. C'est en fait un exemple de ActionController :: Parameters, qui expose le exiger et permis les méthodes.

le exiger Cette méthode garantit que la clé spécifiée est disponible dans le répertoire. params hachage et soulève un ActionController :: ParameterMissing exception si la clé n'existe pas.

le permis méthode vous protège de l'affectation de masse inattendue.

L'appel User.create (params [: utilisateur]) soulève une ActiveModel :: ForbiddenAttributesError exception, mais en utilisant User.create (params.require (: utilisateur) .permit (: nom,: email)) le fait fonctionner sans plainte.

La fonctionnalité d’affectation en masse de Rails 3 est non seulement désactivée dans Rails 4, mais également extraite dans une gemme, au cas où vous en auriez besoin..


Turbolinks

Rails 4 sera thread-safe par défaut, ce qui supprime les frais généraux et améliore les performances.

Turbolinks est une nouvelle fonctionnalité controversée de Rails 4, un plugin JavaScript conçu pour accélérer la navigation dans les applications..

Dans les navigateurs avec pushState support, le plugin Turbolinks entre en action. Il crée une requête Ajax, met à jour l'URL avec pushState (pour que votre bouton retour fonctionne) et utilise JavaScript pour mettre à jour le </code> et <code><body></code> dans les DOM. Les gains de rapidité proviennent de l’absence de téléchargement et de reparse des ressources JavaScript et CSS..</p> <p>Les Turbolinks se dégradent gracieusement pour les navigateurs non compatibles. <code>pushState</code>. Dans ces situations, les liens de la page se comportent normalement, ce qui provoque une actualisation complète de la page..</p> <h3>Événements et cache</h3> <p>Il est courant dans les applications d'attendre le chargement complet d'une page avant d'exécuter du JavaScript. Par exemple:</p> <pre> $ (document) .ready (/ * une fonction à exécuter * /) // ou un événement uniquement $ (/ * une fonction à exécuter * /)</pre> <p>Avec Turbolinks, les événements de chargement de page ne se déclenchent pas lorsque les utilisateurs accèdent de "page" à "page" car le DOM ne se recharge jamais réellement. Par conséquent, la bibliothèque ajoute de nouveaux événements que vous pouvez écouter pour effectuer les initialisations suivantes dont votre application pourrait avoir besoin:</p> <ul> <li> <code>page: chercher</code> - commencer à aller chercher une page sur le serveur</li> <li> <code>page: changement</code> - une page a été chargée</li> <li> <code>page: charger</code> - une page a été chargée à partir d'une récupération de serveur</li> <li> <code>page: restaurer</code> - une page a été chargée à partir d'une extraction de cache</li> </ul> <p>le <code>page: changement</code> événement se déclenche toujours lorsque Turbolinks charge une page, suivi de <code>page: charger</code> ou <code>page: restaurer</code>, selon que la charge provient du serveur ou du cache.</p> <h3>Problèmes potentiels</h3> <blockquote><p>Rails 4 arrive et apporte une multitude de changements au framework.</p></blockquote> <p>Turbolinks soulève quelques problèmes que vous devrez peut-être résoudre:</p> <ul> <li> <strong>Fuites de mémoire</strong>: Turbolinks ne supprime pas ou ne recharge pas votre JavaScript lorsque la page change. Vous pourriez potentiellement voir les effets des fuites de mémoire dans vos applications, surtout si vous utilisez beaucoup de JavaScript..</li> <li> <strong>Reliures événementielles</strong>: Vous devez prendre en compte les anciens navigateurs. Assurez-vous d'écouter <code>page:*</code> événements, ainsi que <code>DOMContentLoaded</code>.</li> <li> <strong>Frameworks côté client</strong>: Turbolinks peut ne pas fonctionner correctement avec d'autres frameworks tels que Backbone, Angular, Knockout, Ember, etc..</li> </ul> <h3>Opting out</h3> <p>Vous pouvez vous désinscrire de Turbolinks en:</p> <ol> <li>enlever <code>turbolinks</code> depuis votre Gemfile, et</li> <li>enlever le <code>// = nécessite des turbolinks</code> ligne de <code>application.js</code> </li> </ol> <hr> <h2>Caching</h2> <p>Rails 4 apporte une stratégie de mise en cache révisée. Tout d’abord, les actions et la mise en cache des pages, comme vous le savez sans doute dans les versions précédentes de Rails, ont été supprimées et extraites dans gems: action et page, respectivement..</p> <h3>Poupées russes</h3> <p>Le nouvel enfant du bloc est la mise en cache de poupées russes ou la mise en cache de fragments imbriqués. La meilleure façon de comprendre ce système est de regarder du code. Supposons que vous ayez une application de gestion de projet. Vous pouvez avoir les modèles suivants:</p> <pre> classe Milestone < ActiveRecord::Base has_many :todos end class Todo < ActiveRecord::Base belongs_to :milestone, :touch => vrai fin</pre> <p>le <code>:toucher</code> Cette option est nécessaire pour que cette stratégie de mise en cache fonctionne correctement. Si une tâche est ajoutée à un jalon, nous devons casser le cache sur le jalon pour éviter de servir des vues obsolètes..</p> <p>Nous avons maintenant des caches à grain fin dans nos vues. Considérez ce fichier comme exemple (<code>app / vues / jalons / show.html.erb</code>):</p> <pre> <% cache @milestone do %> <h1><%= @milestone.name %></h1> <div><%= @milestone.description %></div> <ul> <%= render @milestone.todos %> </ul> <% end %></pre> <p>Et en <code>app / views / todos / _todo.html.erb</code>:</p> <pre> <% cache todo do %> <li> <%= todo.description %> <span><%= todo.status %></span> </li> <% end %></pre> <p>Maintenant, supposons que vous ayez un jalon avec dix todos. La modification d'une seule tâche entraîne la rupture du cache du jalon, mais lors de la génération du code HTML, tous les partiels de la tâche peuvent être extraits du cache, ce qui améliore les temps de rendu..</p> <blockquote><p>PATCH est maintenant le nouveau verbe HTTP pour la mise à jour des ressources.</p></blockquote> <p>Vous échangez du temps contre de l’espace, car cela génère beaucoup de cruauté dans votre mémoire cache. Mais, comme le souligne DHP, les mémoires cache telles que Memcached se débarrassent des anciennes données pour laisser de la place pour de nouvelles données. Donc, ce n'est pas un problème dans la plupart des cas.</p> <h3>Cache Digests</h3> <p>Les condensés de cache sont la solution de Rails 4 pour suivre les modifications des modèles mis en cache de manière agressive. Rails 4 suit les modèles et leurs dépendances, et suffixe les clés de cache fragmentées avec le condensé MD5 du modèle (et ses dépendances). Lorsque vous modifiez l'un de vos modèles, sa clé de cache reçoit la mise à jour et vous n'avez pas à mettre à jour manuellement vos modèles..</p> <p>Pour plus d'informations (et pour une utilisation dans Rails 3), consultez le fichier README pour le gem de digestion du cache..</p> <hr> <h2>Streaming, via ActionController :: Live</h2> <p>Le nouveau <code>ActionController :: Live</code> module offre la possibilité de diffuser des données aux clients. Simplement <code>comprendre</code> le module dans un contrôleur pour permettre à votre application d'envoyer des données en continu arbitraires. Vous devrez utiliser un serveur threadé, comme thin et puma, pour diffuser des données en continu. les actions des contrôleurs de streaming s'exécutent dans un thread séparé.</p> <p>Voici un exemple tiré de la documentation de Rails 4:</p> <pre> classe MyController < ActionController::Base include ActionController::Live def stream response.headers['Content-Type'] = 'text/event-stream' 100.times response.stream.write "hello world\n" sleep 1 response.stream.close end end</pre> <p>Comme le notent les docs, il y a trois choses à garder à l'esprit:</p> <ul> <li>Vous devez écrire des en-têtes <em>avant</em> tu appelles <code>écrire</code> ou <code>Fermer</code> sur le flux de réponse.</li> <li>Vous devez appeler <code>Fermer</code> sur le flux de réponse lorsque vous avez fini d'écrire des données.</li> <li>Assurez-vous que vos actions sont thread-safe, car elles seront exécutées dans un thread séparé.</li> </ul> <hr> <h2>Nicetés et autres choses</h2> <p>Nous avons parlé des fonctionnalités "principales" de Rails 4. Mais cette version est importante et comporte un certain nombre de modifications mineures à prendre en compte..</p> <h3>PIÈCE</h3> <p>Comme décrit dans le blog Rails, PATCH est maintenant le verbe HTTP pour la mise à jour des ressources..</p> <blockquote><p>Cette modification sera généralement transparente pour les développeurs, car les demandes PUT seront toujours acheminées vers le <code>mettre à jour</code> action pour les itinéraires de style RESTful.</p></blockquote> <p>Mais c'est un changement dont vous devriez être conscient; Le routage PUT peut changer dans le futur.</p> <h3>Types de flash personnalisés</h3> <p>Cette petite fonctionnalité peut aider à nettoyer du code. Vous pouvez enregistrer vos propres types de flash à utiliser dans <code>rediriger vers</code> appels et modèles. Par exemple:</p> <pre> Classe # app / controllers / application_controller.rb ApplicationController add_flash_types: erreur,: fin catastrophe # app / controllers / things_controller.rb classe ThingsController < ApplicationController def create #… create a thing rescue Error => e redirect_to un_ chemin,: erreur => e.message rescue Catastrophe => e redirect_ vers un autre chemin,: catastrophe => e.message end end # app / vues / layouts / application.html.erb <div><%= error %></div> <div><%= catastrophe %></div></pre> <h3>Finders obsolètes</h3> <p>Rails 4 désapprouve les hachages d’option de style ancien, ainsi que toutes les méthodes de recherche dynamique (à l’exception de <code>find_by_… </code> et <code>find_by_… </code>). Au lieu de cela, vous utiliserez <code>où</code>:</p> <ul> <li> <code>find_all_by_… </code> peut être réécrit en utilisant <code>où(… )</code>.</li> <li> <code>find_last_by_… </code> peut être réécrit en utilisant <code>où (…) .last</code>.</li> <li> <code>scoped_by_… </code> peut être réécrit en utilisant <code>où(… )</code>.</li> <li> <code>find_or_initialize_by_… </code> peut être réécrit en utilisant <code>où (…) .first_or_initialize</code>.</li> <li> <code>find_or_create_by_… </code> peut être réécrit en utilisant <code>find_or_create_by (…)</code> ou <code>où (…) .first_or_create</code>.</li> <li> <code>find_or_create_by_… !</code> peut être réécrit en utilisant <code>find_or_create_by! (…)</code> ou <code>où (…) .first_or_create!</code>.</li> </ul> <p>La perle de recherche obsolète sera incluse en tant que dépendance dans 4.0. et supprimé en 4.1. Le joyau, cependant, sera présent et maintenu jusqu'à 5,0.</p> <h3>Problèmes de routage</h3> <p>Problèmes de routage est une tentative de sécher votre <code>config / routes.rb</code>. L'idée de base est de définir les sous-ressources communes (telles que les commentaires) comme des préoccupations et de les inclure dans d'autres ressources / routes. Voici l'exemple évident:</p> <pre> préoccupation: commentable do ressources: commentaires fin préoccupation: remarquable do ressources: remarques fin ressources: posts,: concerne =>: ressources commentables: articles,: concerne => [: commentable,: remarquable] # peut en inclure plusieurs</pre> <p>Ce qui précède est équivalent au code Rails 3 suivant:</p> <pre> ressources: posts do ressources: commentaires fin ressources: articles do ressources: commentaires ressources: remarques fin</pre> <p>Personnellement, je ne suis pas sûr que cela ajoute beaucoup de valeur; peut-être est-il utile pour les grandes applications comportant des centaines de routes.</p> <h3>Rappels renommés</h3> <p>Les rappels d’action dans les contrôleurs ont été renommés de <code>*_filtre</code> à <code>*_action</code>. Par exemple:</p> <pre> classe UsersController < ApplicationController before_action :set_user, :except => [: index,: new,: create before_action: require_the_president,: only => [: fire_the_missiles] private def set_user @user = quelqu’un_find_et_set_the_user (params [: id]) fin def require_the_president @ user.is_the_president? fin fin</pre> <p>L'ancien <code>*_filtre</code> les callbacks fonctionnent toujours et ne sont pas obsolètes; alors, vous pouvez toujours les utiliser si vous le souhaitez. DHH a motivé ce changement:</p> <blockquote><p>"Pour éviter l'idée fausse que ces rappels ne permettent que de transformer ou d'interrompre la réponse. Avec le nouveau style, il est plus tentant de les utiliser comme ils le voulaient, tels que la définition d'ivars partagés pour les vues."</p></blockquote> <hr> <h2>Emballer</h2> <p>Rails 4 arrive avec de nombreux changements. J'espère que cet article vous a donné une idée de ce à quoi vous attendre, et peut-être un point de départ pour explorer ce que cette nouvelle version a à offrir.</p> <blockquote> <p>Si vous voulez vraiment vous plonger dans les profondeurs, consultez notre cours Tuts + Premium sur Rails 4!</p> </blockquote> <div class="rek-block"> <center> <ins class="adsbygoogle" style="display:inline-block;width:580px;height:400px" data-ad-client="ca-pub-3810161443300697" data-ad-slot="9434875811"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </center> </div> <div class="h-alltags"> <a href="articles/code">Code</a> </div> </div> </div> </div> </div> <div class="next_posts clearfix"> <div class="n_post"> <div class="next_posts-h1 left_nh1"><a href="/articles/code/digging-into-the-theme-customizer-components.html">Creuser dans le personnaliseur de thème Composants</a></div> <div class="next_posts-img" style="background-image: url('//accentsconagua.com/img/images_21/digging-into-the-theme-customizer-components_2.png');"></div> </div> <div class="n_post"> <div class="next_posts-h1 right_nh1"><a href="/articles/code/digging-in-to-laravels-ioc-container.html">Creuser dans le conteneur IoC de Laravel</a></div> <div class="next_posts-img" style="background-image: url('//accentsconagua.com/img/images_12/digging-in-to-laravels-ioc-container.png');"></div> </div> </div> <footer> <div class="container"> <div class="footer-langs"> <ul class="site-langs-list"> <li><a href="https://www.accentsconagua.com"><i class="flag flag-DE"></i>Deutsch</a></li> <li><a href="https://fr.accentsconagua.com"><i class="flag flag-FR"></i>Français</a></li> <li><a href="https://nl.accentsconagua.com"><i class="flag flag-NL"></i>Nederlands</a></li> <li><a href="https://no.accentsconagua.com"><i class="flag flag-NO"></i>Norsk</a></li> <li><a href="https://sv.accentsconagua.com"><i class="flag flag-SE"></i>Svenska</a></li> <li><a href="https://it.accentsconagua.com"><i class="flag flag-IT"></i>Italiano</a></li> <li><a href="https://es.accentsconagua.com"><i class="flag flag-ES"></i>Español</a></li> <li><a href="https://ro.accentsconagua.com"><i class="flag flag-RO"></i>Românesc</a></li> </ul> </div> <div class="h-block"><a href="/">fr.accentsconagua.com</a><div class="h-block-a"></div></div> <div class="footer-text"> Informations intéressantes et conseils utiles sur la programmation. Développement de sites Web, conception de sites Web et développement Web. Tutoriels Photoshop. Création de jeux informatiques et d'applications mobiles. Devenez un programmeur professionnel à partir de zéro. </div> </div> </footer> <div class="search"> <img class="searchico" src="//accentsconagua.com/img/search.svg" alt=""> </div> <div class="modal"> <div class="modal-content"> <span class="close-button">×</span> <input class="searchmain" type="text" id="search-input" placeholder="Chercher..."> <ul class="searchli" id="results-container"></ul> </div> </div> <link rel="stylesheet" href="css/flags.css"> <link rel="stylesheet" type="text/css" href="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.0/cookieconsent.min.css" /> <script src="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.0/cookieconsent.min.js"></script> <script> window.addEventListener("load", function(){ window.cookieconsent.initialise({ "palette": { "popup": { "background": "#edeff5", "text": "#838391" }, "button": { "background": "#4b81e8" } }, "theme": "classic", "position": "bottom-right" })}); </script> <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <script src="js/scripts.min.js"></script> <script src="js/common.js"></script> <link rel="stylesheet" href="css/fontawesome-all.min.css"> <script> var modal = document.querySelector(".modal"); var trigger = document.querySelector(".search"); var closeButton = document.querySelector(".close-button"); function toggleModal() { modal.classList.toggle("show-modal"); } function windowOnClick(event) { if (event.target === modal) { toggleModal(); } } trigger.addEventListener("click", toggleModal); closeButton.addEventListener("click", toggleModal); window.addEventListener("click", windowOnClick); </script> <script src="https://unpkg.com/simple-jekyll-search@1.5.0/dest/simple-jekyll-search.min.js"></script> <script> SimpleJekyllSearch({ searchInput: document.getElementById('search-input'), resultsContainer: document.getElementById('results-container'), json: '/search.json', searchResultTemplate: '<li><a href="{url}">{title}</a></li>' }) </script> <script src="jquery.unveil2.min.js"></script> <script> $('img').unveil(); </script> </body> </html>