nil的未定义方法:将新帖子形式和@posts一起渲染时的NilClass

时间:2015-06-10 20:51:53

标签: ruby-on-rails

这是一个非常奇怪的错误,已经让我感觉好几个小时了。

有3种型号:用户,学校,帖子。基本上在学校页面(学校#show),有一个帖子列表,用户可以发新帖子。

学校负责人:

def show
  @school = School.find(params[:id])
  $current_school = @school
  @post = @school.posts.build if logged_in?
  @posts = @school.posts

school / show.html.erb:

<div>
  <aside>
      <%= render 'shared/post_form' %>
  </aside>
</div>


<div>
  <% if @school.posts.any? %>
      <%= render @posts %>
  <% end %>
</div>

_post_form.html.erb:

<%= form_for(@post) do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
  <div class="field">
    <%= f.text_area :content, placeholder: "Compose new post..." %>
  </div>
  <%= f.submit "Post", class: "btn btn-primary" %>
<% end %>

帖/ _post.html.erb:

<li>
  <%= image_tag post.user.avatar.url(:thumb) %>
  <span class="user"><%= link_to post.user.name, post.user %></span>
  <span class="content"><%= post.content %></span>
</li>

邮政控制人:

def create
  @post = $current_school.posts.create(content:params[:post[:content],user_id:current_user.id)
  if @post.save
    flash[:success] = "Post created!"
    redirect_to $current_school
  else
    render 'static_pages/home'
  end
end

问题是,当导航到学校#show时,它说

undefined method `avatar' for nil:NilClass

如果我删除了

      @post = @school.posts.build if logged_in?

行,以及_post_form.html.erb片段,帖子列表显示正常。 如果我删除_post.html.erb片段,新的帖子功能也可以正常工作。

但是当它们一起存在时,就会出现错误。

我想问题出在这一行:

@post = @school.posts.build if logged_in?

因为当我发表评论时,帖子列表显示正常。当我将其添加回来时,@ post可以返回有效帖子的列表,但是帖子是nil。

无法弄清楚出了什么问题,请帮助。

由于

编辑:当访问url / schools / 1时,它崩溃并出现NilClass错误,post命令返回

#<Post id: nil, content: nil, user_id: nil, school_id: 1, created_at: nil, updated_at: nil>

但是,它应该从@posts

返回第一篇文章

有可能吗

    @post = @school.posts.build if logged_in?

给@post分配一个零帖子,当它呈现@posts时,它正在寻找@post而不是@posts中的第一个帖子? 如果是这样,我该如何纠正?

Edit2:我试图将@post更改为@test:

@test = @school.posts.build if logged_in?

并且同样的nilClass错误仍然存​​在。所以我以前的猜测是无效的。在这里使用构建应该有问题。但是怎么了?

3 个答案:

答案 0 :(得分:1)

您的帖子在新/展示操作中没有与User相关联,除非您以某种方式将用户插入模型中。尝试:

@post = @school.posts.build(user: current_user) if logged_in?

答案 1 :(得分:0)

这一行:@post = @school.posts.build if logged_in?, 应该没有build方法。 像这样: @post = @school.posts if logged_in?

答案 2 :(得分:0)

请尝试 @post=@school.posts if logged_in? 看看它是否有效 另外一个重要的调试事项我可以告诉你是宝石'pry'。安装它,你可以检查视图/模型/控制器中任何地方的变量值。

希望它有所帮助。