LoadError:无法自动加载常量Message

65
在我的应用程序中,当我提交表单时,出现以下错误:
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 模型在哪里定义的? - Arctodus
如果我从名称中删除Mailboxer ::,我会收到错误消息“Table' dating_development.messages'不存在”。这是有道理的,因为没有消息表,只有通知表。我刚意识到Mailboxer :: Message应该放入一个子目录中,但如果我走下那条路,我将走错路。 - pwz2000
你能分享一下问题中的“用户”模型吗? - Kirti Thorat
@pwz2000,请分享“问题模型”。 - acacia
@pwz2000 你试图将Message类视为ActiveRecord模型。如果消息类不映射到数据库表,则不能将其从User模型中引用为关联。这就是你看到的错误原因。 - Leo Correa
显示剩余3条评论
4个回答

117

按照惯例,在Rails中(并且这是由自动加载程序强制执行的),文件路径应该匹配名称空间。

因此,如果您有一个Mailboxer::Message模型,则应该放在app/models/mailboxer/message.rb中。

此外,当尝试加载Message类时,可能会触发自动加载程序(我猜这是在ActAsMessageable内部发生的)。它在加载路径中查找message.rb文件,在app/model/中找到它,因此加载该文件以便找到Message类。

问题在于,它在那个文件中没有找到Message类,只有一个Mailboxer::Message类(这是不同的)。这就是为什么它会抛出“无法自动加载常量Message,期望/app/models/message.rb来定义它”的原因。

要解决这个问题,请创建目录app/models/mailboxer/,并将Mailboxer::Message放入其中。


1
感谢您的见解。我已经删除了消息模型,因为一开始就不需要它,但是您的观点是完全正确的。 - pwz2000
1
太好了!我寻找了一周,终于找到了。这太正确了,让人感到不舒服! - Amin Ariana
我在类名中出现了大小写不匹配的情况:我引用了 API:: 而不是 Api:: - FloatingRock

3

我在集成测试时遇到了这个问题。结果发现这是与测试夹具有关的。我不得不删除/test/fixtures/wrong_name.yml中未使用的文件。


同样的事情在这里也发生了...我本可以花几个小时来找到罪魁祸首。非常感谢。这是魔法变成疯狂的一个例子... - estani

1
如文档所述,要将消息从A模型发送到B模型,您需要添加以下内容:
acts_as_messageable 

在两个模型中都执行以下操作:

And then do:

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"],保留HTML标签。

它指向“Message:Class”的“attr_accessible”方法未定义。 - pwz2000
我无法在没有ActiveRecord的情况下使用访问器,因为它会出现错误“undefined method 'arel_table'”,指向行“@message = current_user.messages.new”。将AR添加回模型将给我“Table 'dating_development.messages' doesn't exist”,也指向同一行。 - pwz2000
你使用了任何 gem 吗?这个 datin_development 表格没有被粘贴在任何地方,但是出现了错误。 - Jorge de los Santos
是的,我正在使用mailboxer gem。Questions控制器是独立的,我正在尝试使其连接到Mailboxer,这样当用户填写问题表单时,它将创建一条消息并将消息细节发送给收件人(消息正文将是问题)。 - pwz2000
抱歉!任何帮助都将不胜感激 :) 当然我也会继续自己深入研究。 - pwz2000
显示剩余2条评论

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

我之前尝试过那个。不幸的是,它指向相同的错误。我认为这与我必须创建的 Message 模型有关。 - pwz2000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接