63

在我的应用程序中;当我提交表单时,我收到此错误:

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
4

4 回答 4

116

按照 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

于 2014-06-24T16:07:35.540 回答
3

我在集成测试期间得到了这个。原来,这与固定装置有关。不得不删除 /test/fixtures/wrong_name.yml 中我未使用的文件

于 2018-01-31T20:30:06.543 回答
1

如文档中所述,要从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与 gem 无关,并且 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"]

于 2014-06-20T19:00:06.553 回答
0

注意这些行;

@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
于 2014-06-20T19:55:52.113 回答