Rails 3:被称为nil的id,这将错误地为4

时间:2011-04-27 15:47:50

标签: ruby-on-rails ruby-on-rails-3 message null

我正在运行Rails 3并希望拥有一个消息系统。 以下是它的教程:http://www.novawave.net/public/rails_messaging_tutorial.html

这是Rails 2所以我试图在Rails 3中实现它。

但是在我构建了“/ view / sent / index /”并尝试发送消息(即使没有人无法读取它)后,我收到了一个错误:

Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id

app/models/message.rb:16:in `prepare_copies'
app/models/message.rb:14:in `each'
app/models/message.rb:14:in `prepare_copies'
app/controllers/sent_controller.rb:19:in `create'  

我的“发送”控制器看起来像:

def create
    @message = current_user.sent_messages.build(params[:message])

    if @message.save
      flash[:notice] = "Message sent."
      redirect_to :action => "index"
    else
      render :action => "new"
    end
end

第19行将是“if @ message.save”

所以我用Google搜索并发现@message可能是零,但我无法理解为什么。

“view / sent / new /”表单如下:

<% form_for :message, :url => {:controller => "sent", :action => "create"} do |f| %>
  <p>
    To:<br />
    <select name="message[to][]">
      <%= options_from_collection_for_select(User.find(:all), :id, :username, @message.to) %>
    </select>
  </p>

  <p>Subject: <%= f.text_field :subject %></p>
  <p>Body:<br /> <%= f.text_area :body %></p>
  <p><%= f.submit %></p>
<% end %>

在错误页面上,参数提交正确:

Parameters:

{"commit"=>"Save Message",
 "authenticity_token"=>"GtJEl2DnKHy06e3IepnnZU0u9RWNlO7gDOx/7FyXFBo=",
 "utf8"=>"✓",
 "message"=>{"body"=>"test",
 "to"=>["2"],
 "subject"=>"test"}}

我改变了“routes.rb”中的一些行,但我认为这不是重点。 也许有人有提示?

迎接

1 个答案:

答案 0 :(得分:5)

根据教程,这里是错误的代码:

message_copies.build(:recipient_id => recipient.id, :folder_id => recipient.inbox.id)

因此,收件人为零或收件人.inbox为零。据推测它是后者,因为select填充了现有用户。在创建用户时,在前挂钩中创建用户的收件箱。是否所有用户都是通过应用创建的?

打开rails控制台并尝试User.find(2)和User.find(2).inbox。如果这些都不是nil,你可能必须使用调试器或在代码中放置一些打印来确定什么是nil和为什么。