Rails 3: называется id для nil, который по ошибке будет 4 - PullRequest
2 голосов
/ 27 апреля 2011

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

Я изменил некоторые строки в "rout.rb", но я думаю, что это не главное здесь. Может, кто-то получил подсказку?

Greets

1 Ответ

5 голосов
/ 27 апреля 2011

На основе учебника приведен код ошибки:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...