【问题标题】:LoadError Unable to autoload constant MessageLoadError 无法自动加载常量消息
【发布时间】:2014-06-20 16:35:08
【问题描述】:

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

LoadError at /questions
Unable to autoload constant Message, expected /app/models/message.rb to define it

它指向Questions控制器中的create动作:

@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

【问题讨论】:

  • 看起来像是命名空间问题。用户和消息之间的关系是如何定义的,Message模型在哪里定义的?
  • @Sharagoz 如果我从名称中删除Mailboxer::,则会收到错误Table 'dating_development.messages' doesn't exist。这是有道理的,因为没有消息表,只有通知表。我刚刚意识到Mailboxer::Message 应该进入一个子目录,但如果我开始走这条路,我就会走错路。
  • 你能分享问题中的User模型吗?
  • @pwz2000,请分享`问题模型`
  • @KirtiThorat 用户模型添加

标签: ruby-on-rails activemodel rails-models mailboxer


【解决方案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 放入其中。

【讨论】:

  • 感谢您的洞察力。我删除了消息模型,因为它不是一开始就需要的,但你的观点是 100% 正确的。
  • YESSSSSSS!我为期一周的搜索结束了。这是如此令人不安的正确!
  • 我的类名大小写不匹配:我引用的是 API:: 而不是 Api::
【解决方案2】:

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

【讨论】:

  • 同样的事情......我本可以花几个小时找到罪魁祸首。非常感谢。这是魔法变成精神错乱的一个例子……
【解决方案3】:

如文档中所述,要将消息从 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"]

【讨论】:

  • 它指向undefined method `attr_accessible' for Message:Class
  • 我无法在没有 ActiveRecord 的情况下使用访问器,因为它会给出错误 undefined method `arel_table’,它指向行 @message = current_user.messages.new。将 AR 添加回模型会给我Table 'dating_development.messages' doesn't exist,它也指向同一行。
  • 你在使用任何 gem 吗?这个 datin_development 表没有粘贴到任何地方,而是在错误中。
  • 是的,我正在使用邮箱 gem。 Questions 控制器是独立的,我试图让它连接到 Mailboxer,所以当用户填写 Question 表单时,它将创建一条消息给收件人,其中包含消息的详细信息(消息的正文将是问题)。
  • 那么问题应该包含该信息。我不知道那个宝石:|让我查资料!
【解决方案4】:

注意这些行;

@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

【讨论】:

  • 我以前试过。不幸的是,它指向了同样的错误。我认为这与我必须创建的 Message 模型有关。
猜你喜欢
  • 1970-01-01
  • 2016-04-13
  • 2020-08-27
  • 2019-03-14
  • 2019-08-19
  • 2020-03-31
  • 2017-10-22
  • 1970-01-01
  • 2018-11-05
相关资源
最近更新 更多