Внутренний обмен сообщениями в Rails - PullRequest
0 голосов
/ 10 октября 2010

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

Но, так как мое последнее обновление до 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

Ответы [ 2 ]

1 голос
/ 10 октября 2010

Этот учебник кажется немного устаревшим.Он использует 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 голосов
/ 10 октября 2010

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

...