2010-10-15 3 views
1

Je crée une application de blog de base et je rencontre des problèmes d'affichage des messages d'erreur lorsqu'un utilisateur essaie de soumettre un commentaire vide. Au lieu d'obtenir un beau message d'erreur, un message d'erreur d'enregistrement actif avec la validation correcte erorrs. Tels que
ActiveRecord::RecordInvalid in CommentsController#create
Validation failed: Name can't be blank, Email can't be blankComment afficher les messages d'erreur pour les validations de ressources imbriquées?

Dans mon article/vue spectacle que j'ai le code suivant:

<%= form_for([@article, @article.comments.build]) do |f| %> 
    <%= render "shared/error_messages", :target => @article %> 
    <div class="field"> 
    <%= f.label :name %><br /> 
    <%= f.text_field :name %> 
    </div> 
    <div class="field"> 
    <%= f.label :email %><br /> 
    <%= f.text_field :email %> 
    </div> 
    <div class="field"> 
    <%= f.label :body %><br /> 
    <%= f.text_area :body %> 
    </div> 
    <p><%= f.submit %></p> 
<% end %> 

Mes messages d'erreur regards partiels comme celui-ci:

<% if target.errors.any? %> 
     <div id="error_explanation"> 
     <h2><%= pluralize(target.errors.count, "error") %> prohibited this record from     being saved:</h2> 

    <ul> 
     <% target.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
    </ul> 
    </div> 
<% end %> 

Je sais la réponse est simple mais je ne peux pas la comprendre.

Créer une action dans le contrôleur de commentaires:

def create 
@article = Article.find(params[:article_id]) 
@comment = @article.comments.build(params[:comment]) 
respond_to do |format| 
    if @comment.save 
    format.html { redirect_to(@article, :notice => 'Comment was successfully created.') } 
    format.xml { render :xml => @article, :status => :created, :location => @article } 
    else 
    format.html { render :action => "articles/show" } 
    format.xml { render :xml => @comment.errors, :status => :unprocessable_entity } 
    end 
end 

Répondre

2

Je pense que vous dites que vous obtenez la grande page d'erreur gris sur blanc, non?

Vérifiez la trace, mais je soupçonne que cela vient de l'action create dans le contrôleur, pas la vue.

Si votre contrôleur utilise save! avec le ! à la fin, cela signifie qu'il déclenchera une erreur si l'enregistrement est invalide. Par contre, save renvoie true ou false et vous permet d'utiliser la logique de branche simple pour décider comment réagir.

Si mon intuition sur save! n'est pas correct, s'il vous plaît, postez le code du contrôleur afin que nous puissions creuser plus profondément :) Merci!

+0

J'ai ajouté l'action créée dans le contrôleur de commentaires. Merci! – RobertH

+0

Ah, maintenant j'ai l'application rediriger vers le bon contrôleur et l'action, mais pas de messages d'erreur. Merci de m'avoir mis sur la bonne voie. – RobertH

+0

Résolu, postera la solution, merci encore. – RobertH

1

La solution consistait à rediriger l'action créée par les commentaires vers le bon contrôleur/action et la cible @comment dans mon message d'erreur partial.

Vue finale

<%= form_for([@article, @article.comments.build]) do |f| %> 
    <%= render "shared/error_messages", :target => @comment %> 
    <div class="field"> 
    <%= f.label :name %><br /> 
    <%= f.text_field :name %> 
    </div> 
    <div class="field"> 
    <%= f.label :email %><br /> 
    <%= f.text_field :email %> 
    </div> 
    <div class="field"> 
    <%= f.label :body %><br /> 
    <%= f.text_area :body %> 
    </div> 
    <p><%= f.submit %></p> 
<% end %> 

final créer une action dans les commentaires contrôleur

def create 
    @article = Article.find(params[:article_id]) 
    @comment = @article.comments.build(params[:comment]) 
    respond_to do |format| 
     if @comment.save 
     format.html { redirect_to(@article, :notice => 'Comment was successfully created.') } 
     format.xml { render :xml => @article, :status => :created, :location => @article } 
     else 
     format.html { render :action => "articles/show" } 
     format.xml { render :xml => @comment.errors, :status => :unprocessable_entity } 
     end 
    end 
3

J'ai eu un problème similaire. tout semblait bien fonctionner, mais je ne recevais pas d'erreurs La solution que j'ai trouvé est de construire le commentaire à l'article # show au lieu de la vue:

@article = Article.find(params[:id]) 
@comment = @article.comments.build(params[:comment]) 

et dans vos articles # show ne pas utiliser @ article.comments.build mais @comment:

<%= form_for([@article, @comment]) do |f| %> 
    <%= render 'shared/error_messages', :object => f.object %> 
    <p><%= f.submit %></p> 
<% end %> 

assurez-vous de construire le commentaire dans votre commentaire # créer aussi bien (vous avez vraiment pas d'autre choix que: P)

aussi, je ne sais pas si cela compte (je suis assez nouveau pour ruby), mais je pense que vous devez passer f.ob au lieu de @comment.

Questions connexes