在Rails中显示嵌套资源的错误消息

时间:2016-10-06 22:37:06

标签: ruby-on-rails ruby-on-rails-4 ruby-on-rails-5

我正在创建我的第一个应用,简单的博客,而且我不知道如何显示没有通过验证的嵌套资源(评论)的错误消息。

这是为评论创建行动:

  def create
    @post = Post.find(params[:post_id])
    @comment = @post.comments.create(comment_params)
    redirect_to post_path(@post)
  end

这是评论表:

  <%= form_for([@post, @post.comments.build]) do |f| %>
    <p>
      <%= f.label :commenter %><br />
      <%= f.text_field :commenter %>
    </p>

    <p>
      <%= f.label :text %><br />
      <%= f.text_area :text %>
    </p>

    <p>
      <%= f.submit %>
    </p>
  <% end %>

我尝试过:

  def create
    @post = Post.find(params[:post_id])
    @comment = @post.comments.build(comment_params)

    if @comment.save
      redirect_to post_path(@post)
    else
      render '/comments/_form'
    end
  end

和:

  <% if @comment.errors.any? %>
    <div id="error_explanation">
      <h2>
        <%= pluralize(@comment.errors.count, "error") %> prohibited
        this comment from being saved:
      </h2>
      <ul>
        <% @comment.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

但我不知道什么是错的。

1 个答案:

答案 0 :(得分:2)

您无法从控制器渲染部分内容。更好的选择是创建new视图。

class CommentsController
  def create
    if @comment.save
      redirect_to post_path(@post), success: 'comment created'
    else
      render :new
    end
  end
end

应用程序/视图/评论/ new.html.erb:

<% if @comment.errors.any? %>
  <div id="error_explanation">
    <h2>
      <%= pluralize(@comment.errors.count, "error") %> prohibited
      this comment from being saved:
    </h2>
    <ul>
      <% @comment.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
    </ul>
  </div>
<% end %>
<%= render partial: 'form', comment: @comment %>

应用程序/视图/评论/ _form.html.erb:

<%= form_for([@post, local_assigns[:comment] || @post.comments.build]) do |f| %>
    <p>
        <%= f.label :commenter %><br />
        <%= f.text_field :commenter %>
    </p>

    <p>
        <%= f.label :text %><br />
        <%= f.text_area :text %>
    </p>

    <p>
        <%= f.submit %>
    </p>
<% end %>