这是一个非常奇怪的错误,已经让我感觉好几个小时了。
有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错误仍然存在。所以我以前的猜测是无效的。在这里使用构建应该有问题。但是怎么了?
答案 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'。安装它,你可以检查视图/模型/控制器中任何地方的变量值。
希望它有所帮助。