Rails 3: сообщения неопределенного метода для папки

#ruby-on-rails-3 #methods #directory #message #undefined

#ruby-on-rails-3 #методы #каталог #Сообщение #не определено

Вопрос:

Я использую Rails 3 и хотел бы иметь систему сообщений. Вот руководство по этому вопросу: http://www.novawave.net/public/rails_messaging_tutorial.html

Это для Rails 2, поэтому я пытался реализовать это в Rails 3.

Все прошло нормально, и я могу отправлять сообщения. Но когда я хочу проверить свой почтовый ящик, появляется эта ошибка:

 undefined method `messages' for #<Folder:0x0000010419fd48>
  

Контроллер почтового ящика:

 class MailboxController < ApplicationController
  def index
    redirect_to new_session_path and return unless logged_in?
    @folder = current_user.inbox
    show
    render :action => "show"
  end

  def show
    @folder ||= current_user.folders.find(params[:id])
    @messages = @folder.messages.paginate :per_page => 10, :page => params[:page], :include => :message, :order => "messages.created_at DESC"
  end
end
  

Когда я проверяю консоль с:

 User.find(9).inbox
  

все в порядке, и результат:

 ruby-1.9.2-p180 :085 > User.find(9).inbox
 => #<Folder id: 1, user_id: 9, parent_id: nil, name: "Inbox", created_at: "2011-04-27 21:37:00", updated_at: "2011-04-27 21:37:00"> 
  

Но когда я добавляю .messages, он возвращает ошибку.

Когда я пытаюсь извлечь руководство по сообщениям, оно работает:

 User.find(9).received_messages
 => [#<MessageCopy id: 7, recipient_id: 9, message_id: 8, folder_id: 1, created_at: nil, updated_at: "2011-04-27 23:15:25">, #<MessageCopy id: 8, recipient_id: 9, message_id: 9, folder_id: 1, created_at: nil, updated_at: "2011-04-27 23:25:06">]
  

Модели и контроллеры такие же, как в руководстве.

Есть идеи?

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

Редактировать:

* Добавлена ошибка и представление

Ошибка:

 undefined method `messages' for #<Folder:0x0000010409c900>

app/controllers/mailbox_controller.rb:11:in `show'
app/controllers/mailbox_controller.rb:5:in `index'
  

Почтовый ящик / показать вид:

 <h2><%=h @folder.name %></h2>

<table border="1">
  <tr>
    <th>From</th>
    <th>Subject</th>
    <th>Received</th>
  </tr>

  <% @messages.each do |message| %>
    <tr>
      <td><%=h message.author.login %></td>
      <td><%= link_to h(message.subject), message_path(message) %></td>
      <td><%= distance_of_time_in_words(message.created_at, Time.now) %> ago</td>
    </tr>
  <% end %>
</table>

<%= will_paginate @messages %>
  

Комментарии:

1. Опубликуйте полную ошибку (номер строки и откуда она поступает), а также код просмотра.

2. Я отредактировал это в своем первом сообщении.

Ответ №1:

Возможно, вы пропустили шаг в установлении взаимосвязей в ваших моделях.

Убедитесь, что в вашей папке.rb (модель папки) установлена связь has_many с сообщениями.

 class Folder < ActiveRecord::Base
   has_many :messages, :class_name => "MessageCopy"
  

Ошибка, которую вы получаете в контроллере, сообщает вам, что это не так, в модели папок нет метода с именем ‘messages’, который ActiceRecord (Rails ‘ ORM) сгенерирует для вас с помощью кода has_many.

ян.

Комментарии:

1. Моя модель папки такова: папка класса < ActiveRecord::Base acts_as_tree принадлежит пользователю has_many :messages, :class_name => «MessageCopy» end

2. Вы выполнили rake db: migrate? Модель папок действует так, как будто в ней не определен метод сообщений.

3. Что происходит в консоли rails, когда вы выполняете: f = Folder.first; f.сообщения?

4. Результат: ошибка имени: неопределенная локальная переменная или метод acts_as_tree' for #<Class:0x103f06fa0> from /Users/mtomicki/.rvm/gems/ree-1.8.7-2011.01@mark/gems/activerecord-3.0.5/lib/active_record/base.rb:1008:in method_missing’ из /Users/mtomicki/swtor/svn.minicore.de/app/models/folder.rb:2