Rails, вложенные модели, массивы, перебор цикла for - PullRequest
1 голос
/ 10 сентября 2011

Я новичок в 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%> не работает.

Спасибо! При необходимости выложу больше кода

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