Rails 3: Вызывается id для nil, который ошибочно равен 4

Я использую 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».

Итак, я погуглил и обнаружил, что @message может быть нулевым, но я не могу понять, почему.

Форма «просмотр/отправлено/новое/» выглядит так:

<% 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", но я думаю, что дело не в этом. Может кто подсказал?

Приветствует


person Maaaark    schedule 27.04.2011    source источник


Ответы (1)


Основываясь на учебнике, вот код с ошибкой:

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

Таким образом, либо получатель равен нулю, либо получатель.входящий ящик равен нулю. Предположительно, это последнее, потому что выбор заполняется существующими пользователями. Папка пользователя создается в хуке перед созданием пользователя. Все ли ваши пользователи были созданы через приложение?

Откройте консоль rails и попробуйте User.find(2) и User.find(2).inbox. Если ни один из них не равен нулю, вам, возможно, придется использовать отладчик или ввести некоторые отпечатки в код, чтобы выяснить, что равно нулю и почему.

person Brian Deterling    schedule 27.04.2011
comment
Да, действительно, я тоже так думаю: у пользователя с id=2 нет папки с именем «Входящие». - person nathanvda; 27.04.2011
comment
Окей, большое спасибо! Это был почтовый ящик... После создания нового пользователя все заработало... - person Maaaark; 28.04.2011