f.error_messages dans les Rails 3.0
Rails 3.0 obsolète f.error_messages
et maintenant, nécessite un plugin pour fonctionner correctement - je toutefois vous voulez apprendre comment afficher les messages d'erreur de la (nouvelle) natif moyen. Je suis à la suite de la guide de mise en route, qui utilise la méthode dépréciée lors de la mise en œuvre du formulaire de commentaires. Par exemple:
<h2>Add a comment:</h2>
<%= form_for([@post, @post.comments.build]) do |f| %>
<%= f.error_messages %>
<div class="field">
<% f.label :commenter %><br />
<%= f.text_field :commenter %>
</div>
<div class="field">
<%= f.label :body %><br />
<%= f.text_area :body %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
Ici est la bonne façon de le faire (comme généré par l'échafaudage):
<%= form_for(@post) do |f| %>
<% if @post.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@post.errors.count, "error") %> prohibited this post from being saved:</h2>
<ul>
<% @post.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
. . .
Je comprends que j'utilise le @post
variable dans le dernier exemple, mais ce que variable dois-je faire référence à l'ancienne pour obtenir les messages d'erreur pour le commentaire de la création?
- Votre question est en contradiction avec. Ici vous demandez comment obtenez des messages d'erreur pour les commentaires "à l'ancienne", par exemple, qui indique que vous vous posez à propos de l'affaire avec
f.error_messages
. (Ou avez-vous voulu dire "dans la forme", pas "à l'ancienne"?) Cependant, dans les commentaires, vous vous demandez comment obtenez des messages d'erreur "sans l'aide def.error_messages
". Alors, qui est-il?
Vous devez vous connecter pour publier un commentaire.
Je viens de regarder dans le docrails github questions, et ils ont décidé de supprimer des f.error_messages au lieu d'expliquer comment faire de la validation des commentaires.
Le meilleur et propre façon de mettre en œuvre error_messages dans votre formulaire par la mise en œuvre error_messages dans un FormBuilder.
Par exemple, voici la error_messages méthode que j'ai mis en place pour mon dernier projet.
Par implemeting votre propre FormBuilder vous pouvez suivre les règles et les styles de votre webdesigner...
Voici un exemple de sortie de la liste d'erreurs à l'ul/li avec certains styles personnalisés :
Puis dans mes formulaires :
Et c'est tout.
Je suis sûr que tout vous devez faire est de référence
@post.comments
De sorte que vous pourriez faire quelque chose comme:
Ou il suffit de tirer toutes les erreurs out:
puis parcourir en boucle dans votre logique d'affichage à la sortie de chaque commentaire erreurs.
form_for([@post, @post.comments.build])
. C'est plutôt toujours étéform_for(@post) do |p|
et puisp.fields_for(@post.comments.build) do |c|
. Ainsi, vous pouvez rechercher à l'aide de champs pour l'intérieur de la poste le formulaire à la place?Cette fonctionnalité existe autonome, gem dynamic_form.
Ajouter les éléments suivants à votre
Gemfile
De la page github:
DynamicForm détient quelques aides méthode pour vous aider à composer avec votre Rails3 des modèles, ils sont:
input(record, method, options = {})
form(record, options = {})
error_message_on(object, method, options={})
error_messages_for(record, options={})
Il ajoute également
f.error_messages
etf.error_message_on
à votre formulaire constructeurs.Voici ma solution pour l'ensemble de l'erreur de la scène.
J'ai créé une partielle qui utilise simplement une variable de modèle, celui qui passe lors de son affichage:
Vous pouvez facilement ajouter du html dynamique de la classe et/ou de noms de code, basé sur le nom du modèle, ainsi que des génériques.
J'ai des choses de l'installation où mes messages d'erreur rendre dans tous la même place dans un fichier de mise en page:
Si l'on ne voulait pas de cette fonctionnalité, le retrait de la content_for dans le partiel ferait l'affaire.
Alors en tout point de vue que vous voulez, vous pouvez simplement écrire:
On pourrait étendre cette par la création d'un partiel qui prend une collecte et exploite l'erreur partielle ci-dessus:
Rendre avec:
J'aime de cette façon. Il est simple, facile à gérer et à maintenir, et incroyablement tweakable.
J'espère que cela aide!
EDIT: Tout en HAML
Je suppose que le
[@post, @post.comments.build]
tableau est passé juste àpolymorphic_path
à l'intérieur deform_for
. Cela génère un sous-chemin d'accès aux ressources pour les commentaires (comme/posts/1/comments
dans ce cas). Donc, il semble que votre premier exemple utilise des observations à titre de sous-ressources à des postes, à droite?.Donc en fait le contrôleur qui sera appelé ici est la
CommentsController
. La raison pour laquelle Lukas solution ne fonctionne pas pour vous, peut-être que vous n'utilisez pas @poste.commentaires.construire à l'intérieur de la manette lors de la création du commentaire (il n'a pas d'importance que vous utilisez dans la vue lors de l'appel deform_for
). LeCommentsController#create
méthode devrait ressembler à ceci (plus ou moins):Ensuite, vous pouvez utiliser le code généré par un échafaudage, ne remplacez
@post
variable d'instance avec@comment
dans toutes les lignes saufform_for
appel.Je pense qu'il peut aussi être une bonne idée d'ajouter la
@comment = @post.comment.build
à la méthode de contrôleur qui affiche ce formulaire et l'utilisationform_for([@post, @comment], ...)
pour garder la forme contenu est affiché dans le formulaire si il y a des erreurs.Si cela ne fonctionne pas et que vous n'êtes pas en mesure de le comprendre, s'il vous plaît ajouter votre
CommentsController#create
méthode à la question.