如何显示嵌套资源验证的错误消息?

时间:2010-10-15 02:08:02

标签: ruby-on-rails validation nested-forms

我正在创建一个基本的博客应用程序,当用户尝试提交空白评论时,我遇到了显示错误消息的问题。而不是获得漂亮的错误消息,与正确的验证erorrs的活动记录错误消息。如     ActiveRecord::RecordInvalid in CommentsController#create
    Validation failed: Name can't be blank, Email can't be blank

在我的文章/节目视图中,我有以下代码:

<%= 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 %>

我的错误消息部分如下所示:

    <% 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 %>

我知道答案很简单,但我无法理解。

在评论控制器中创建操作:

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 个答案:

答案 0 :(得分:4)

我有类似的问题。一切似乎都很好,但我没有得到任何错误 我找到的解决方案是在文章#show而不是视图中构建注释:

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

在你的文章#show中不要使用@ article.comments.build而是@comment:

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

确保你在评论中创建评论#create(你真的别无选择:P)

另外,我不知道它是否重要(我对ruby很新),但我认为你需要传递f.object而不是@comment。

答案 1 :(得分:2)

我想你是说你得到了一个灰白色的大错误页面,对吗?

检查回溯,但我怀疑这是来自控制器中的create操作,而不是视图。

如果您的控制器在末尾使用save!并使用!,则表示如果记录无效,则会引发错误。另一方面,save返回true或false,并允许您使用简单的分支逻辑来决定如何做出反应。

如果我对save!的预感不正确,请发布控制器代码,以便我们可以深入挖掘:)谢谢!

答案 2 :(得分:1)

解决方案是将注释创建的操作指向正确的控制器/操作,并在我的错误消息部分中定位@comment。

最终观点

    <%= 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 %>

评论控制器中的最终创建操作

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