Activerecord 试图在嵌套模型中获得答案的作者会给出`为nil调用的id,该id将错误地为4`
今天,我的错误被称为id for nil,它会被错误地称为4-如果您真的想要nil的id,请使用object_id 我已经为用户、票证和答案定义了以下模型和控制器: 用户有许多答案和问题 这张票有很多答案 答案属于用户&属于票证 在“票证”视图中,当我尝试显示答案时,会出现此错误。作者用户的操作如下: 票务加载0.2ms从票务限制1中选择票务。* => 答案加载0.2ms选择答案。*从答案限制1 => 用户负载0.2ms选择用户。*来自用户限制1 => 控制器部分:Activerecord 试图在嵌套模型中获得答案的作者会给出`为nil调用的id,该id将错误地为4`,activerecord,ruby-on-rails-3.2,Activerecord,Ruby On Rails 3.2,今天,我的错误被称为id for nil,它会被错误地称为4-如果您真的想要nil的id,请使用object_id 我已经为用户、票证和答案定义了以下模型和控制器: 用户有许多答案和问题 这张票有很多答案 答案属于用户&属于票证 在“票证”视图中,当我尝试显示答案时,会出现此错误。作者用户的操作如下: 票务加载0.2ms从票务限制1中选择票务。* => 答案加载0.2ms选择答案。*从答案限制1 => 用户负载0.2ms选择用户。*来自用户限制1 => 控制器部分: class TicketsC
class TicketsController < ApplicationController
before_filter :login_required
before_filter :admin_required, :only => [:index, :show]
def index
@tickets = Ticket.all
end
def show
@ticket = Ticket.find(params[:id])
end
end
class AnswersController < ApplicationController
def create
t_attr = params[:answer].merge :user => current_user
@ticket = Ticket.find(params[:ticket_id])
@answer = @ticket.answers.create(t_attr)
redirect_to ticket_path(@ticket)
end
end
编辑:
通过控制台,我可以获得answer的作者用户数据:
Ticket.first.answers.first.user
Ticket Load (0.2ms) SELECT "tickets".* FROM "tickets" LIMIT 1
Answer Load (0.1ms) SELECT "answers".* FROM "answers" WHERE "answers"."ticket_id" = 8 LIMIT 1
User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
=> #<User id: 1, username: "mickula", email: "xx@xx.com", password_hash: "$2a$10$Hty2ekM3t8Dqf0CvZm5zEOwVnXAoytimW9tIOxtfjwNG...", password_salt: "$2a$10$Hty2ekM3t8Dqf0CvZm5zEO", created_at: "2013-01-12 16:55:00", updated_at: "2013-01-12 16:55:00", permission_level: nil>
票务视图:
<span class="pull-right">by <strong><%=h @ticket.user.username %></strong> on <i><%=h @ticket.created_at %> in <strong><%= @ticket.category.name %></strong></i></span>
<p>
<strong>Message:</strong><br>
<%=h @ticket.message %>
</p>
<h3>Replies</h3>
<%= form_for([@ticket, @ticket.answers.build]) do |f| %>
<%= f.label :message %> <br>
<%= f.text_area :message, :cols => "50", :rows => "6", :class=> "span12" %><br>
<%= f.submit %>
<% end %>
<% @ticket.answers.each do |a| %>
<%= h a.message %> <%= a.user.username %> <%= a.created_at %>
<% end %>
</div>
解决方法:
<% @ticket.answers.each do |a| %>
<%= h a.message %> <%= a.user.username if a.user %> <%= a.created_at %>
<% end %>
在这种情况下,一切正常。
似乎Loop正在进行一次额外的迭代,即使没有答案。Rails脚手架为此创建了新的空对象:
<%= form_for([@ticket, @ticket.answers.build]) do |f| %>
因为这个循环在最后用一个对象进行了一次额外的迭代
要解决这个问题,我只需遍历ticket.answers.length-1对象。您确定有id=1的用户吗?如果不是的话,这就解释了为什么到处都是零。100%肯定。已使用用户的查询结果更新问题。我相信,如果用户不存在,我就不能为ticket显示它。在这种情况下,您的视图或控制器中肯定发生了其他事情。你能发布票证查看代码吗?如果有的话,还有任何部分吗?这可能会有帮助。发布控制器的部分-没有什么特别的。实际上我指的是视图&视图部分,如果有的话。
<% @ticket.answers.each do |a| %>
<%= h a.message %> <%= a.user.username if a.user %> <%= a.created_at %>
<% end %>
<%= form_for([@ticket, @ticket.answers.build]) do |f| %>
def create
t_attr = params[:answer].merge :user => current_user
@ticket = Ticket.find(params[:ticket_id])
@answer = @ticket.answers.create(t_attr)
redirect_to ticket_path(@ticket)
end