【问题标题】:How do I display error messages for nested resource validations?如何显示嵌套资源验证的错误消息?
【发布时间】:2010-10-15 02:08:02
【问题描述】:

我正在创建一个基本的博客应用程序,当用户尝试提交空白评论时,我遇到了显示错误消息的问题。不是得到一个漂亮的错误消息,而是一个带有正确验证错误的活动记录错误消息。如
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 %>

我知道答案很简单,但我想不通。

在 cmets 控制器中创建操作:

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

【问题讨论】:

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


    【解决方案1】:

    我遇到了类似的问题。一切似乎都很好,但我没有收到任何错误 我找到的解决方案是在 article#show 中构建评论而不是视图:

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

    并且在您的文章中#show 不要使用@article.cmets.build,而是使用@comment:

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

    确保你在你的comment#create中也建立了评论(虽然你真的别无选择:P)

    另外,我不知道这是否重要(我对 ruby​​ 很陌生),但我认为您需要传递 f.object 而不是 @comment。

    【讨论】:

      【解决方案2】:

      我想你是说你得到了大的白底灰错误页面,对吧?

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

      如果你的控制器使用save!,最后是!,这意味着如果记录无效,它将引发错误。另一方面,save 返回 true 或 false,让您使用简单的分支逻辑来决定如何做出反应。

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

      【讨论】:

      • 我在 cmets 控制器中添加了创建的动作。谢谢!
      • 啊,现在我的应用程序重定向回正确的控制器和操作,但没有错误消息。感谢您让我走上正轨。
      【解决方案3】:

      解决方案是将 cmets 创建的操作引导回正确的控制器/操作,并在我的错误消息部分中定位 @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 %>
      

      cmets 控制器中的最终创建操作

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-19
        • 1970-01-01
        • 1970-01-01
        • 2016-01-06
        • 1970-01-01
        • 2017-10-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多