试图显示错误消息,但遇到:nil的未定义方法`errors':NilClass

时间:2013-08-19 20:15:21

标签: ruby-on-rails error-handling

我正在尝试在Rails中实现错误消息,但我不知道它在某一时刻无法正常工作。

视图我正在尝试添加错误消息:

<%= form_for([@post, @post.comments.build], html: {class: 'form-horizontal'}) do |f| %>

            <% if @comment.errors.any? %>

                <div id="errorExplanation" class="span5 offset1 alert alert-error">
                    <button type="button" class="close" data-dismiss="alert">&times;</button>

                    <h4>Something went wrong!</h4><br>

                    <% @post.errors.full_messages.each do |msg| %>
                    <p><%= msg %></p>
                    <% end %>
                </div>

        <% end %>

控制器:

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

错误信息:

nil的未定义方法`errors':NilClass 提取的来源(第65行):

<li>
            <%= form_for([@post, @post.comments.build], html: {class: 'form-horizontal'}) do |f| %>

65 ->                       <% if @comment.errors.any? %>

                    <div id="errorExplanation" class="span5 offset1 alert alert-error">
                        <button type="button" class="close" data-dismiss="alert">&times;</button>

评论当然属于一个可以有很多评论的帖子。有帮助吗?我尝试了所有我能想到的东西(由于我是RoR的新手,但这并不多;) - 包括尝试获取错误消息的各种方法(@ post.comment.errors.any?等)。

提前致谢。 蒂莫

1 个答案:

答案 0 :(得分:1)

从你的评论中可以看到很多事情。

您正在尝试创建注释,因此表单操作应该是CommentsController #create。 该视图有意义,它将是PostsController#show(您没有指定),并且在渲染之前您需要实例化@comment。可能:

<强> PostsController

def show
  @post = Post.find(params[:id])
  @comment = @post.comments.build
end

<强> CommentsController

def create
  @post = Post.find(params[:post_id])
  @comment = @post.comments.build(params[:comment].permit(:commenter, :body))
  if @comment.save
    redirect_to post_path(@post)
  else
    render :file => "posts/show"
  end 
end

请注意,您必须呈现而不是重定向,以便保留@comment实例并可以呈现错误。

posts / show.html.erb

<%= form_for([@post, @post.comments.build], html: {class: 'form-horizontal'}) do |f| %>
    <% if @comment.errors.any? %>

这是否正确将取决于你的routes.rb。我假设评论是帖子中的嵌套资源,这是你的问题所能想到的。