2010-10-10 4 views
0

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

Но, начиная с моего последнего обновления до Rails 3, я получаю эту ошибку:

NoMethodError in MsgController#sendmsg 
undefined method `each' for #<String:0xcc8acc0> 
след

Применение:

app/models/message.rb:16:in `prepare_copies' 
app/controllers/msg_controller.rb:140:in `sendmsg' 

модель Сообщение:

class Message < ActiveRecord::Base 
    belongs_to :author, :class_name => "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) 
     message_copies.build(:recipient_id => recipient.id, :folder_id => recipient.inbox.id) 
    end 
    end 
end 
+0

Нам нужен ваш контроллер msg_controller, потому что он находится в их ошибке. – shingara

ответ

1

Этот учебник кажется немного устаревшим. Он использует Rails 2.0 (и, вероятно, какую-то не менее старую версию Ruby).

Вы уверены, что to имеет массив (как указано в вашем комментарии attr_accessor)? Сообщение об ошибке, похоже, указывает на то, что это строка.

Вы ранее использовали этот код под Ruby 1.8 (и, предположительно, версию Rails 2.3)?

В Ruby 1.8 вы можете отправить each экземплярам String и по умолчанию выполнить итерацию по строкам строки (на самом деле она разделилась бы на $/ и повторила бы результат).

В Ruby 1.9 вам необходимо использовать each_line для перебора строк строки.

to.each_line do |recipient| 
    … 
end 
0

Кажется, вы больше не являетесь Массивным, а String. Вы проблемные semmes становятся с вашего контроллера и как вы определяете свой аксессуар внутри него.

Смежные вопросы