[RAILS] [Après avoir appris Progate] j'ai essayé de résumer form_with en comparant avec form_tag

De nombreuses personnes déplacent leur apprentissage des tutoriels Progate vers Rails.

Le formulaire est difficile même dans Progate. Il est vraiment difficile de s'inscrire ou de se connecter en utilisant le formulaire.

Cependant, Progate est toujours écrit de manière facile à comprendre.

Créez un formulaire avec form_tag, envoyez des données avec et recevez les données avec des paramètres. Très facile à comprendre.

Cependant, quand j'ai commencé à apprendre sérieusement Rails, j'ai arrêté d'utiliser form_tag et utilisé form_with. À partir de cette zone, la quantité de description de Rails diminuera fortement. Le degré de compréhension est également considérablement réduit.

Cet article s'adresse à ceux qui suivent un parcours d'apprentissage comme le tutoriel Rails de Progate et qui ne comprennent tout simplement pas form_with.

J'écrirai en comparant comment écrire Progate et comment écrire Rails.

En conclusion, je pense que le style d'écriture de Progate vise un "style d'écriture cohérent" pour les débutants. À l'origine, quand il y a un changement dans la base de données, form_tag n'est pas utilisé. Utilisez form_for.

Progate utilise l'assistant form_tag et les balises d'entrée pour créer une impression artisanale.

Si vous l'implémentez avec `` form_tag '', qui est souvent utilisé dans Progate, ce sera très fait à la main.

Quant au flux,

  1. Envoyez les données au contrôleur avec form_tag et input tag.
  2. Recevez des données avec l'action de création
  3. Enregistrer et écrire dans la base de données
<%= form_tag("/users/create") do %>
  <p>Nom d'utilisateur</p>
    <input name="name" value="<%= @user.name %>">
  <p>adresse mail</p>
    <input name="email" value="<%= @user.email %>">
    <input type="submit" value="s'inscrire">
 <% end %>

Définissez le chemin avec form_tag. Définissez le chemin vers / users / create. A ce moment, dans le routage (routes.rb),

C'est écrit, n'est-ce pas? Ainsi, l'action de création dans users_controller.rb sera déclenchée. Le contenu de l'action de création est le suivant.

  def create
    @user = User.new(name: params[:name], email: params[:email])
    if @user.save
      flash[:notice] = "L'enregistrement de l'utilisateur est terminé"
      redirect_to("/users/#{@user.id}")
    else
      render("users/new")
    end
  end

Ça ressemble à ça.

Le flux est facile à saisir, n'est-ce pas? Je reçois ce que j'ai envoyé du formulaire sous forme de paramètres et je l'enregistre en utilisant @ user.save, afin de pouvoir les comprendre logiquement.

Si vous passez au tutoriel Rails à partir d'ici, vous n'utiliserez plus form_tag.

C'est parce que la façon dont Progate est écrit est exceptionnelle.

Utilisez form_for lorsque la base de données est impliquée

Je n'utilise pas comment écrire un progate. form_tag n'est pas utilisé lors d'un nouvel enregistrement, modification ou suppression dans la base de données.

Lors de l'édition de la base de données, utilisez form_for.

Prenez un objet de modèle (un objet (instance) créé à partir du modèle User, tel que @ user = User.new) comme argument.

Au moment de form_tag, je faisais la chose gênante de récupérer les informations d'identifiant de: id, de trouver l'enregistrement dans la base de données et de modifier ces informations.

Il y avait un tel processus.

Cependant, le grand avantage de Rails est que @user a également automatiquement un ID utilisateur.

Rails est fortement en boîte noire, donc

Spécifiez la destination avec form_tag.

Lorsque vous utilisez des aides liées aux formulaires avec Ruby on Rails dans Progate, vous avez utilisé form_tag, n'est-ce pas?

À ce moment-là, je suis resté coincé dans l'omission. Progate écrit tout de toute façon. Forme

Qu'est-ce que form_with?

form_with est une combinaison de form_tag et de form_for. form_tag a spécifié le chemin. form_for a spécifié un objet de modèle (une instance créée à partir d'un modèle).

C'est form_with que vous pouvez utiliser les deux.

form_tag

<%= form_tag 'chemin' do %>
  <contribution ...
  <contribution ...
<% end %>

Contrairement à l'écriture

form_for est

<%= form_for(@user) do |f| %>
  <%= f.text_field :name %>
  <%= f.submit %>
<% end %>

Comme vous pouvez le voir, il est ennuyeux d'écrire différemment même si la forme est similaire. En créant tout form_with et en essayant d'unifier le style d'écriture, il est devenu un.

Cependant, ceux qui ont appris Progate ont appris form_tag, donc

"Quoi? Est-ce un modèle comme argument de forme?"

Je suis confus. Nous avons mis l'action et sommes venus.

La grande chose à ce sujet est que form_with model: @ user et model sont égoïstes.

Lorsque vous le faites avec form_tag, vous avez spécifié l'action.

<% = form_tag (" / users / create ") do%> Ceci est la partie. L'action de création est spécifiée.

Cependant, lors de l'écriture du modèle: @user,

Lors de l'inscription en tant que nouvel utilisateur, Cela appellera une nouvelle action

De cette manière, il modifie l'action à appeler avec précaution. Rails possède de nombreuses fonctionnalités qui vous font gagner du temps et des efforts.

Tout d'abord, vous recevrez: des informations d'identification de l'URL. Ensuite, identifiez l'utilisateur à partir des informations d'identification

Ceci: Tout le travail de récupération de l'identifiant est inutile. En fait, Rails fait tout automatiquement. Cependant, Progate a tout ignoré lors de l'apprentissage initial,

"Je ne suis pas sûr, mais Rails fera tout."

C'est difficile à comprendre, alors il l'explique bien.

Sommaire

-Form_tag est utilisé lorsqu'il n'y a pas de changement dans la base de données ・ Form_for est utilisé lors de la création d'un formulaire qui implique la mise à jour de la base de données. ・ Form_with peut jouer les deux rôles

Rails est très attentif. Il fera diverses choses sans permission.

"Je l'ai finalement fait sans qu'on me le dise."

Je dirais. Mais au début

«Pourquoi avez-vous décidé cela?

Vous vous demandez peut-être. Je suis toujours confus par l'esprit de Rails.

Cependant, je ne pense pas qu'il y ait quelque chose de plus pratique et de plus fiable lorsque vous pouvez le maîtriser. Faisons de notre mieux pour que nous puissions le maîtriser.

Recommended Posts

[Après avoir appris Progate] j'ai essayé de résumer form_with en comparant avec form_tag
J'ai essayé de résumer l'apprentissage Java (1)
J'ai essayé de résumer le support d'iOS 14
J'ai essayé d'interagir avec Java
J'ai essayé de résumer Java 8 maintenant
Après avoir appris Progate, j'ai essayé de créer une application SNS en utilisant Rails dans l'environnement local
J'ai essayé de résumer les méthodes utilisées
J'ai essayé de résumer les expressions Java lambda
J'ai essayé de démarrer avec Web Assembly
J'ai essayé l'apprentissage de la gestion qui fait gagner du temps avec Studyplus.
J'ai essayé de résumer l'API Stream
Qu'est-ce que Docker? J'ai essayé de résumer
J'ai essayé de résumer sur JVM / garbage collection
J'ai essayé de vérifier AdoptOpenJDK 11 (11.0.2) avec l'image Docker
J'ai créé une application d'apprentissage automatique avec Dash (+ Docker) part3 ~ Practice ~
J'ai essayé de faire une authentification de base avec Java
J'ai essayé de gérer la configuration des jambes de force avec Coggle
J'ai essayé de gérer les informations de connexion avec JMX
J'ai essayé de casser le bloc avec java (1)
J'ai essayé ce que je voulais essayer avec Stream doucement.
J'ai essayé d'implémenter le téléchargement de fichiers avec Spring MVC
J'ai essayé de lire et de sortir CSV avec Outsystems
[Java 11] J'ai essayé d'exécuter Java sans compiler avec javac
J'ai démarré MySQL 5.7 avec docker-compose et j'ai essayé de me connecter
J'ai essayé de démarrer avec Spring Data JPA
[Apprentissage automatique] J'ai essayé la détection d'objets avec Create ML [détection d'objets]
J'ai essayé de résumer divers link_to utilisés cette fois
J'ai essayé de dessiner une animation avec l'API Blazor + canvas
J'ai essayé d'implémenter Sterling Sort avec Java Collector
J'ai essayé de créer un environnement de développement java8 avec Chocolatey
J'ai essayé d'augmenter la vitesse de traitement avec l'ingénierie spirituelle
J'ai essayé de résumer les bases de kotlin et java
[Rails] J'ai essayé de créer une mini application avec FullCalendar
J'ai brièvement résumé la grammaire de base de Ruby
J'ai essayé de lier le chat avec le serveur de Minecraft avec l'API Discord
J'ai essayé de résumer les applications et les outils de développement personnellement utiles (Apps)
J'ai essayé de créer un environnement de développement padrino avec Docker
J'ai essayé de démarrer avec Swagger en utilisant Spring Boot
J'ai essayé de résumer l'orientation de l'objet à ma manière.
J'ai essayé de pouvoir passer plusieurs objets avec Ractor
J'ai essayé d'exprimer les résultats avant et après de la classe Date avec une ligne droite numérique
J'ai créé une application d'apprentissage automatique avec Dash (+ Docker) part2 ~ Façon basique d'écrire Dash ~
J'ai essayé DI avec Ruby
J'ai essayé UPSERT avec PostgreSQL.
J'ai essayé BIND avec Docker
J'ai essayé de vérifier yum-cron
J'ai essayé de résoudre le problème de la "sélection multi-étapes" avec Ruby
J'ai essayé de résumer ce qui était demandé lors de l'édition site-java-
J'ai essayé de créer un environnement de serveur UML Plant avec Docker
J'ai essayé de me connecter à MySQL en utilisant le modèle JDBC avec Spring MVC
[Rubiy] J'ai essayé de résumer le traitement de la boucle ce soir [fois, pause ...]