LoadError Невозможно автоматически загрузить сообщение
В моем приложении; когда я отправляю форму, я получаю эту ошибку:
LoadError at /questions
Unable to autoload constant Message, expected /app/models/message.rb to define it
Он указывает на действие create
в контроллере Questions
:
@message = current_user.messages.new(:subject => "You have a question from #{@question.sender_id}"`
Модель сообщения:
class Mailboxer::Message < ActiveRecord::Base
attr_accessible :notification_id, :receiver_id, :conversation_id
end
Ответы
Ответ 1
По соглашению в rails (и это принудительно выполняется автозагрузчиком), пути к файлам должны соответствовать пространствам имен.
Итак, если у вас есть модель Mailboxer::Message
, она должна быть в app/models/mailboxer/message.rb
.
Кроме того, вы, вероятно, загружаете автозагрузчик при попытке загрузить класс Message
(думаю, это происходит изнутри ActAsMessageable). Он ищет файл message.rb
в пути загрузки, находит его в app/model/
и загружает этот файл таким образом, чтобы он мог найти класс Message
.
Проблема заключается в том, что в этом файле не найден класс Message
, а только класс Mailboxer::Message
(который радикально отличается). Вот почему он выбрасывает "Невозможно автозагрузить постоянное сообщение, ожидаемое /app/models/message.rb, чтобы определить его".
Чтобы исправить это, создайте каталог app/models/mailboxer/
и поместите в него Mailboxer::Message
.
Ответ 2
Как указано в документации, для отправки сообщения от модели A
модели B
необходимо добавить:
acts_as_messageable
в обеих моделях.
И затем выполните:
a.send_message(b, "Body", "subject")
Итак, в ваших моделях:
class User < ...
act_as_messageable
end
@question_sender
должен быть экземпляром User
.
@question_sender.send_message({attr_accessor_hash}, recipient_user, @question.body, "You have a question from #{@question_sender.id}")
Пока attr_accessor
не связан с драгоценным камнем, и метод send_message не знает об этих атрибутах, вам придется переопределить его:
https://github.com/mailboxer/mailboxer/blob/master/lib/mailboxer/models/messageable.rb#L60
добавить метод attr_accessor_hash в метод
def send_message({attr_accesor_hash}, recipients, msg_body, subject, sanitize_text=true, attachment=nil, message_timestamp = Time.now)
И посмотрите на код, добавьте поля, где вам нужно: attr_accessor["param"]
Ответ 3
Обратите внимание на следующие строки:
@question = Question.new(params[:question])
@question.message = @message
и;
attr_accessible :answer, :question, :sender_id, :recipient_id, :conversation_id
Строка @question.message
вызывает атрибут, недоступный в Question Model
, поэтому сделайте это;
attr_accessible :answer, :question, :sender_id, :recipient_id, :conversation_id, message