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..
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..
Rails 4 ne supportera que Ruby 1.9.3+. Préparez-vous pour une mise à niveau si ce n'est déjà fait.
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!
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.
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
.
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.
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..
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
et dans les DOM. Les gains de rapidité proviennent de l’absence de téléchargement et de reparse des ressources JavaScript et CSS..
Les Turbolinks se dégradent gracieusement pour les navigateurs non compatibles. pushState
. Dans ces situations, les liens de la page se comportent normalement, ce qui provoque une actualisation complète de la page..
Il est courant dans les applications d'attendre le chargement complet d'une page avant d'exécuter du JavaScript. Par exemple:
$ (document) .ready (/ * une fonction à exécuter * /) // ou un événement uniquement $ (/ * une fonction à exécuter * /)
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:
page: chercher
- commencer à aller chercher une page sur le serveurpage: changement
- une page a été chargéepage: charger
- une page a été chargée à partir d'une récupération de serveurpage: restaurer
- une page a été chargée à partir d'une extraction de cachele page: changement
événement se déclenche toujours lorsque Turbolinks charge une page, suivi de page: charger
ou page: restaurer
, selon que la charge provient du serveur ou du cache.
Rails 4 arrive et apporte une multitude de changements au framework.
Turbolinks soulève quelques problèmes que vous devrez peut-être résoudre:
page:*
événements, ainsi que DOMContentLoaded
.Vous pouvez vous désinscrire de Turbolinks en:
turbolinks
depuis votre Gemfile, et// = nécessite des turbolinks
ligne de application.js
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..
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:
classe Milestone < ActiveRecord::Base has_many :todos end class Todo < ActiveRecord::Base belongs_to :milestone, :touch => vrai fin
le :toucher
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..
Nous avons maintenant des caches à grain fin dans nos vues. Considérez ce fichier comme exemple (app / vues / jalons / show.html.erb
):
<% cache @milestone do %><%= @milestone.name %>
<%= @milestone.description %>
Et en app / views / todos / _todo.html.erb
:
<% cache todo do %>
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..
PATCH est maintenant le nouveau verbe HTTP pour la mise à jour des ressources.
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.
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..
Pour plus d'informations (et pour une utilisation dans Rails 3), consultez le fichier README pour le gem de digestion du cache..
Le nouveau ActionController :: Live
module offre la possibilité de diffuser des données aux clients. Simplement comprendre
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é.
Voici un exemple tiré de la documentation de Rails 4:
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
Comme le notent les docs, il y a trois choses à garder à l'esprit:
écrire
ou Fermer
sur le flux de réponse.Fermer
sur le flux de réponse lorsque vous avez fini d'écrire des données.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..
Comme décrit dans le blog Rails, PATCH est maintenant le verbe HTTP pour la mise à jour des ressources..
Cette modification sera généralement transparente pour les développeurs, car les demandes PUT seront toujours acheminées vers le
mettre à jour
action pour les itinéraires de style RESTful.
Mais c'est un changement dont vous devriez être conscient; Le routage PUT peut changer dans le futur.
Cette petite fonctionnalité peut aider à nettoyer du code. Vous pouvez enregistrer vos propres types de flash à utiliser dans rediriger vers
appels et modèles. Par exemple:
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<%= error %><%= catastrophe %>
Rails 4 désapprouve les hachages d’option de style ancien, ainsi que toutes les méthodes de recherche dynamique (à l’exception de find_by_…
et find_by_…
). Au lieu de cela, vous utiliserez où
:
find_all_by_…
peut être réécrit en utilisant où(… )
.find_last_by_…
peut être réécrit en utilisant où (…) .last
.scoped_by_…
peut être réécrit en utilisant où(… )
.find_or_initialize_by_…
peut être réécrit en utilisant où (…) .first_or_initialize
.find_or_create_by_…
peut être réécrit en utilisant find_or_create_by (…)
ou où (…) .first_or_create
.find_or_create_by_… !
peut être réécrit en utilisant find_or_create_by! (…)
ou où (…) .first_or_create!
.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.
Problèmes de routage est une tentative de sécher votre config / routes.rb
. 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:
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
Ce qui précède est équivalent au code Rails 3 suivant:
ressources: posts do ressources: commentaires fin ressources: articles do ressources: commentaires ressources: remarques fin
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.
Les rappels d’action dans les contrôleurs ont été renommés de *_filtre
à *_action
. Par exemple:
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
L'ancien *_filtre
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:
"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."
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.
Si vous voulez vraiment vous plonger dans les profondeurs, consultez notre cours Tuts + Premium sur Rails 4!