Du coup, quand j'ai vu pour la première fois redirect_to
et `` render '', je n'ai pas vraiment compris la différence entre eux.
Creusons profondément et apprenons ensemble!
redirect_to: envoie une requête HTTP au serveur et l'utilisateur voit le HTML renvoyé par celui-ci. render: méthode qui spécifie le fichier View à appeler dans l'action.
Je pense qu'il y a certaines parties qui sont difficiles à comprendre avec juste des mots, donc je vais expliquer chaque ** flux de traitement **.
redirect_flux de traitement de à
① redirection dans le traitement du contrôleur_Courir vers
②redirect_Requête HTTP à l'URL spécifiée par l'argument to(GET!!)Courir
③ Requête HTTP(GET!!)Exécute le processus de routage correspondant à l'URL
(4) Le contrôleur et l'action correspondant au processus de routage sont appelés et le processus est exécuté.
⑤ Exécuter le rendu de vue en fonction du processus
① contrôleur (redirect_to) → ② requête HTTP (GET !!) → ③ routage → ④ contrôleur → ⑤ vue
flux de processus de rendu
① Exécuter le rendu dans le processus de contrôleur
(2) Afficher le fichier de vue spécifié par l'option de rendu
①controller(render) → ②view
Il faut noter ici que la destination de redirect_to est toujours le routage de la ** méthode GET **.
Vous le voyez de temps en temps. Un contrôleur comme celui ci-dessous.
controllers/books.rb
class BooksController < ApplicationController
def index
end
end
Si rien n'est mentionné dans l'action, le rendu sera exécuté automatiquement! !!
En d'autres termes, dans le cas ci-dessus, il semble que render'index '' 'soit omis, et cette action appelle
views / books / index.html.erb' '.
Jetons maintenant un œil à quelques exemples couramment utilisés de redirect_to et render!
controllers/books.rb
class BooksController < ApplicationController
def create
@book = Book.new(book_params)
@book.user_id = current_user.id
if @book.save
redirect_to books_path, flash[:notice] = "Publication réussie! !!"
else
flash.now[:alert] = "Échec de la publication!!"
render 'new'
end
end
end
Lors de la publication, si le résultat de la méthode de sauvegarde est vrai, il sera redirigé vers la page de la liste des articles, et s'il est faux, la page des nouveaux articles sera réaffiche.
Avez-vous remarqué que vous n'avez appelé aucune action lors de l'affichage du fichier de vue à l'aide du rendu?
↑ render'new '' n'affiche que
books / new.html.erb '', pas via la nouvelle action.
Dans ce modèle, je veux afficher une nouvelle page car la publication a échoué, mais si j'utilise redirect_to, j'appelle une nouvelle action et passe une méthode vide à la variable d'instance, donc nouvelle L'action étant dans l'état de réinitialisation, les données saisies par l'utilisateur disparaissent. Par conséquent, les informations pour l'émission du message d'erreur disparaîtront également et l'utilisateur ne pourra pas voir "pourquoi n'a pas pu publier".
C'est compliqué, mais cela détermine un tournant important, alors j'espère que vous y ferez face jusqu'à ce que vous ayez faim.
Je n'entrerai pas dans les détails car il est loin de la ligne principale, mais si vous souhaitez envoyer un message dans la vue affichée, écrivez comme suit.
redirect_Dans le cas de
flash[:notice] = "message"
Ou
notice: "message"
Pour le rendu
flash.now[:alert] = "message" #c'est maintenant! !! !! !!
J'ai expliqué la différence entre redirect_to et render, ce qui est facile pour les débutants de faire des erreurs! !! Dans l'explication, j'apprends souvent par moi-même et je suis parfaitement conscient de l'importance de la production.
Recommended Posts