Я новичок в Ruby и следую этому учебнику novawave (немного старше) по созданию внутренней системы обмена сообщениями.
http://www.novawave.net/public/rails_messaging_tutorial.html
В настоящее время я пытаюсь составить список отправленных сообщений, но не могу правильно связать сообщение с «получателями». Вот цикл for:
<% for message in @messages %>
<tr>
<td><%= message.user.name %></td>
<td><%= message.subject %></td>
<td><%= message.recipients.map(&:user).to_sentence %></td>
Я получаю ошибку «постоянная единица» для «получателей». У меня есть три модели: Пользователь, Message_Copy и Сообщение.
Модель сообщения
принадлежит пользователю,
has_many: получатели,: through =>: message_copies
Message_Copy модель
own_to Сообщение и получатель
Модель пользователя
has_many других моделей.
Я заметил эту же проблему в других приложениях. Когда я перебираю массив, если первичная модель «принадлежит» другой модели, я могу получить доступ к этой модели. Например, я могу получить доступ к модели пользователя, потому что модель сообщения "принадлежит_" модели пользователя. Следовательно, я могу использовать message.user.name. Но я не могу получить доступ к атрибутам модели, которая "принадлежит_" основной модели. Поэтому я не могу получить доступ к атрибутам модели Message_Copy в этом массиве. Поэтому message.recipient.id вернет ошибку. Возможно, на этот вопрос уже был дан ответ, и я, возможно, просто делаю серию легких ошибок. Но я запутался и надеялся, что кто-нибудь сможет помочь и, возможно, объяснить, что мне не хватает. Пожалуйста, дайте мне знать, если требуется дополнительная информация. Спасибо
Извините, вот еще код из моделей:
Модель пользователя
class User < ActiveRecord::Base
attr_accessor :password
attr_accessible :name, :email, :password, :password_confirmation
has_many :sent_messages, :class_name => "Message"
has_many :received_messages, :class_name => "MessageCopy", :foreign_key =>"recipient_id"
has_many :folders
class MessageCopy < ActiveRecord::Base
belongs_to :message
belongs_to :recipient
belongs_to :folder
delegate :user, :created_at, :subject, :body, :recipients, :to => :message
end
class Message < ActiveRecord::Base
belongs_to :user
has_many :message_copies
has_many :recipients, :through => :message_copies
before_create :prepare_copies
attr_accessor :to # array of people to send to
attr_accessible :subject, :body, :to
def prepare_copies
return if to.blank?
to.each do |recipient|
recipient = User.find(recipient)
@recipient=recipient
message_copies.build(:recipient_id => recipient.id, :folder_id => recipient.inbox.id)
end
end
end
Я заметил, что это сработало:
<% = message.message_copies%>
Вместо приведенного выше кода:
<td><%= message.recipients %></td>
Я не понимаю этого, потому что учебник может использовать «получателей», а также потому, что я могу ссылаться на модель Message_Copy через Recipients в других методах.
Но
<% = message.message_copies%>
также просто возвращает массив, и мне неясно, как я могу получить конкретные атрибуты в модели message_copy, так как
<% = message.message_copies.content%>
не работает.
Спасибо! При необходимости выложу больше кода