Activerecord 试图在嵌套模型中获得答案的作者会给出`为nil调用的id,该id将错误地为4`

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

今天,我的错误被称为id for nil,它会被错误地称为4-如果您真的想要nil的id,请使用object_id

我已经为用户、票证和答案定义了以下模型和控制器:

用户有许多答案和问题

这张票有很多答案

答案属于用户&属于票证

在“票证”视图中,当我尝试显示答案时,会出现此错误。作者用户的操作如下:

票务加载0.2ms从票务限制1中选择票务。* =>

答案加载0.2ms选择答案。*从答案限制1 =>

用户负载0.2ms选择用户。*来自用户限制1 =>

控制器部分:

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