Cet article approfondit ma compréhension en écrivant un article de commentaire du tutoriel Rails pour solidifier davantage mes connaissances Cela fait partie de mon étude. Dans de rares cas, un contenu ridicule ou un contenu incorrect peut être écrit. Notez s'il vous plaît. J'apprécierais que vous me disiez implicitement ...
La source Tutoriel Rails
Nous apprendrons en détail comment créer des applications Rails en créant un exemple d'application de type Twitter Sample_app. Ce chapitre commence par créer un nouveau projet Sample_app.
J'ai écrit des articles en détail jusqu'au chapitre 2, mais après le chapitre 3 La quantité de code augmentera considérablement, alors ce que vous pouvez faire en lisant le tutoriel Rails Je vais l'abréger ...
Créer une nouvelle Sample_app Mettez à jour le Gemfile. N'oubliez pas - sans production car je ne veux pas réinstaller la gemme pg de production cette fois-ci. Puisqu'il s'agit d'une nouvelle application, initialisez le référentiel Git. READ ME est également réécrit ici. Après avoir réécrit le README, validez-le pour le moment. Créez également un référentiel distant pour Sample_app sur Github. Après avoir créé un référentiel distant, poussez-le Pour l'environnement Cloud9, modifiez development.rb afin que l'application puisse être démarrée localement. Pour le moment, ajoutez simplement le code pour bonjour et affichage du monde comme dans le chapitre 2 et poussez-le vers heroku.
domaines heroku '' ``.Comme habitude de développement, au lieu de toujours travailler sur la branche principale, créez une branche thématique chaque fois que vous implémentez quelque chose On dit que c'est une bonne habitude de travailler. Ce faisant, il est facile de diviser le travail. Facile à voir le travail Il y a plusieurs avantages. Créez une branche thématique à chaque fois pour prendre l'habitude et travailler
$ git checkout -b static-pages
Créer à partir du contrôleur pour les pages statiques à la fois
$ rails g controller StaticPages home help
générer peut être l'abréviation g Il existe d'autres abréviations, et c'est une bonne idée de les retenir.
Commande complète | Forme raccourcie |
---|---|
$ rails server | $ rails s |
$ rails console | $ rails c |
$ rails generate | $ rails g |
$ rails test | $ rails t |
$ bundle install | $ bundle |
From Rails Tutorial 6e édition https://railstutorial.jp/chapters/static_pages?version=6.0#table-shortcuts
Pour le moment, poussez la branche pages-statiques à distance à ce stade Si vous utilisez l'option -u pour définir l'origine en amont des pages statiques Après cela, vous pouvez faire le même push avec juste `` git push ''.
Lorsque le contrôleur est automatiquement généré avec la commande generate, le fichier routes.rb est également automatiquement mis à jour. Dans ce cas, j'ai créé une action home et une action help avec generate.
routes.rb
Rails.application.routes.draw do
get 'static_pages/home'
get 'static_pages/help'
# For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
root "application#hello"
end
Les règles de routage pour les actions d'accueil et d'aide sont définies automatiquement. Démarrez le serveur local et affichez la page d'accueil de static_pages.
Rails fera référence au routeur lorsque vous spécifiez l'URL (cette fois / static_pages / home) Exécutez l'action du contrôleur correspondant. (Action à la maison du contrôleur StaticPages) Après cela, la vue correspondant à l'action est sortie. Le contrôleur de page statique ne change pas de contenu à chaque fois, donc l'action est vide (même contenu de page).
$ rails g controller Foo bar baz
$ rails d controller Foo
La page d'accueil et la page d'aide créées dans l'état actuel sont complétées en HTML et sont des pages complètement statiques. En d'autres termes, c'est une page qui peut être éditée sans connaissance de Rails. Ici, comme au chapitre 2, vous pouvez obtenir des données utilisateur ou publier des données en fonction du contenu. La connaissance des rails (ERB) est requise pour les actions qui modifient le contenu d'affichage (dynamique).
Avant d'ajouter la page À propos, rédigez un test pour la page À propos à l'avance. Puisque la commande generate génère automatiquement des tests pour les pages d'accueil et d'aide Tout d'abord, exécutez un test pour confirmer qu'il n'y a pas de problème pour le moment
$ rails t
...
Finished in 6.708000s, 0.2982 runs/s, 0.2982 assertions/s.
2 runs, 2 assertions, 0 failures, 0 errors, 0 skips
Red Le cycle de développement de test de conduite (TDD) est Ecrire les tests qui échouent (tests pour les fonctionnalités non implémentées, etc.) → Échec (RED) Écrivez le code d'application réel et passez le test écrit précédemment → Succès (VERT) 3 étapes de refactoring (REFACTOR)
Sur cette base, j'écrirai un test de la page À propos que je n'ai pas encore fait
static_pages_controller_test.rb
require 'test_helper'
class StaticPagesControllerTest < ActionDispatch::IntegrationTest
...
test "should get about" do
get static_pages_about_url
assert_response :success
end
end
Ce code envoie une requête GET à la page about de static_pages Je teste le contenu que le code de réponse est 200 OK (succès).
Bien sûr, je n'ai pas encore implémenté de page À propos, donc j'obtiens l'erreur comme prévu.
Green Jetons un œil au message d'erreur
Error:
StaticPagesControllerTest#test_should_get_about:
NameError: undefined local variable or method `static_pages_about_url' for #<StaticPagesControllerTest:0x000055b65cfc03b0>
test/controllers/static_pages_controller_test.rb:15:in `block in <class:StaticPagesControllerTest>'
Si vous le lisez en détail Dans StaticPagesControllerTest should_get_about Aucune méthode n'est définie pour static_pages_about_url (il n'y a pas d'URL À propos) Est en colère.
C'est parce que je n'ai pas configuré le routage
Ajoutons le routage à la fois.
dans routes.rb
get 'static_pages/about'
Ajouter.
L'ajout d'une route active un assistant appelé static_pages_about_url.
Si vous relancez le test, cette fois
Error:
StaticPagesControllerTest#test_should_get_about:
AbstractController::ActionNotFound: The action 'about' could not be found for StaticPagesController
test/controllers/static_pages_controller_test.rb:15:in `block in <class:StaticPagesControllerTest>'
C'est aussi une simple erreur Je suis en colère de ne pas trouver l'action à propos. C'est le résultat de l'ajout d'un routage pour faire référence à l'action about du contrôleur static_pages.
Ajoutons immédiatement une action À propos
def about
end
Écrivez simplement ceci dans le contrôleur static_pages Le contenu de l'action est toujours une page complètement statique comme l'accueil et l'aide, donc elle peut être vide
Si vous exécutez le test avec ceci, cette fois
Error:
StaticPagesControllerTest#test_should_get_about:
ActionController::MissingExactTemplate: StaticPagesController#about is missing a template for request formats: text/html
test/controllers/static_pages_controller_test.rb:15:in `block in <class:StaticPagesControllerTest>'
C'est en colère que le modèle about (vue) ne puisse pas être trouvé.
Ceci est également pris en charge par l'ajout d'une vue. Ajoutez about.html.erb dans app / views / static_pages.
Le test réussit (VERT) dans cet état
Finished in 0.976764s, 3.0714 runs/s, 3.0714 assertions/s.
3 runs, 3 assertions, 0 failures, 0 errors, 0 skips
Changez le titre de manière dynamique. Désactiver la mise en page pour l'étude
$ mv app/views/layouts/application.html.erb layout_file
Cette commande renomme et déplace temporairement le fichier de disposition application.html.erb pour le désactiver.
Écrivez d'abord le test de titre Le titre doit changer de page en page, donc le code ressemble à ceci.
test "should get home" do
get static_pages_home_url
assert_response :success
assert_select "title", "Home | Ruby on Rails Tutorial Sample App"
end
test "should get help" do
get static_pages_help_url
assert_response :success
assert_select "title", "Help | Ruby on Rails Tutorial Sample App"
end
test "should get about" do
get static_pages_about_url
assert_response :success
assert_select "title", "About | Ruby on Rails Tutorial Sample App"
end
Sélectionnez la balise de titre et assurez-vous que son contenu correspond. Bien sûr, le test est ROUGE car il n'est pas implémenté
Tout d'abord, réécrivez la vue de la page d'accueil, d'aide, à propos.
Puisque j'ai défini un titre pour chaque page, le test sera VERT.
Finished in 0.062407s, 48.0717 runs/s, 96.1433 assertions/s.
3 runs, 6 assertions, 0 failures, 0 errors, 0 skips
def setup
@base_title = "Ruby on Rails Tutorial Sample App"
end
test "should get home" do
get static_pages_home_url
assert_response :success
assert_select "title", "Home | #{@base_title}"
end
test "should get help" do
get static_pages_help_url
assert_response :success
assert_select "title", "Help | #{@base_title}"
end
test "should get about" do
get static_pages_about_url
assert_response :success
assert_select "title", "About | #{@base_title}"
end
À ce stade, la plupart de la structure HTML (balises de base telles que head) est dupliquée sur toutes les pages d'accueil, d'aide et à propos. Le titre est également le même pour l'exemple d'application du didacticiel Ruby on Rails. Il est important de supprimer cette duplication et DRY.
La méthode de fourniture est dans la vue
symbole,"Chaîne")En spécifiant
Vous pouvez appeler la chaîne de caractères associée au symbole avec yield.
Le code Ruby peut être utilisé dans les vues
La vue est intégrée Ruby [ERB (Embedded RuBy)] est un fichier au format qui vous permet d'intégrer Ruby en HTML.
Entourez <%%> et exécutez simplement l'instruction à l'intérieur
La différence est que l'enfermer dans <% =%> exécute l'instruction à l'intérieur et insère le résultat dans le modèle.
Voici le résultat de la réécriture de la partie titre en utilisant ce mécanisme
```erb
<% provide(:title,"Help") %>
<!DOCTYPE html>
<html>
<head>
<title><%= yield(:title) %> | Ruby on Rails Tutorial Sample App</title>
</head>
Bien sûr, le test réussit également.
Si cela est laissé tel quel, les parties communes resteront, donc je vais le refactoriser immédiatement. Tout d'abord, activez le fichier de mise en page que vous avez désactivé précédemment
mv layout_file app/views/layouts/application.html.erb
Ensuite, remplacez les balises de titre placées individuellement dans accueil, aide et environ par les balises de titre du fichier de mise en page.
erb:application.html.erb
<!DOCTYPE html>
<html>
<head>
<title><%= yield(:title)%> | Ruby on Rails Tutorial Sample App</title>
<%= csrf_meta_tags %>
<%= csp_meta_tag %>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
</head>
<body>
<%= yield %>
</body>
</html>
Le contenu de la vue de chaque page est remplacé tel qu'il est dans la partie rendement. En d'autres termes, ce qui s'affiche lorsque vous essayez d'afficher chaque page C'est application.html.erb qui charge la vue de chaque page.
Après cela, des éléments supplémentaires tels que les balises html sont laissés dans la vue de chaque page, et en l'état, application.html.erb Puisqu'il sera dupliqué, supprimez les parties inutiles et faites de la vue de chaque page uniquement le contenu.
erb:help.html.erb
<% provide(:title,"Help") %>
<h1>Help</h1>
<p>
Get help on the Ruby on Rails Tutorial at the
<a href="https://railstutorial.jp/help">Rails Tutorial help page</a>.
To get help on this sample app, see the
<a href="https://railstutorial.jp/#ebook"><em>Ruby on Rails Tutorial</em>
book</a>.
</p>
static_pages_controller_test.rb
test "should get contact" do
get static_pages_contact_url
assert_response :success
assert_select "title", "Contact | #{@base_title}"
end
Après cela, ajoutez le routage des contacts à routes.rb et Ajouter une action de contact à static_pages_controller Créez simplement une vue de contact.
Finished in 1.044651s, 3.8290 runs/s, 7.6581 assertions/s.
4 runs, 8 assertions, 0 failures, 0 errors, 0 skips
Le test réussit également.
Pour le moment, j'ai défini l'action bonjour pour afficher bonjour, monde dans l'URL racine à déployer
J'ai créé une page d'accueil cette fois, donc je vais la déplacer là-bas
root 'static_pages/home'
static_pages_controller_test.rb
test "should get root" do
get root_url
assert_response :success
end
Error:
StaticPagesControllerTest#test_should_get_root:
NameError: undefined local variable or method `root_url' for #<StaticPagesControllerTest:0x000055d85cb31200>
test/controllers/static_pages_controller_test.rb:10:in `block in <class:StaticPagesControllerTest>'
J'ai eu une erreur si la méthode root_url n'était pas définie.
Vous pouvez voir que l'assistant root_url peut être utilisé en définissant rootURL.
Depuis que les travaux du chapitre 3 sont terminés Commettre Si vous exécutez le test lors du déploiement, vous n'aurez pas à vous soucier de trouver des bogues après le déploiement.
Recommended Posts