#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