LoadError无法自动加载常量消息

时间:2014-06-20 16:35:09

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

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

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 个答案:

答案 0 :(得分:93)

按惯例在rails中(这由autoloader强制执行),文件路径应与命名空间匹配。

因此,如果你有Mailboxer::Message模型,它应该在app/models/mailboxer/message.rb

此外,您可能在尝试加载Message类时启动了自动加载器(我的猜测是它发生在ActAsMessageable中)。它在加载路径中查找message.rb文件,在app/model/中找到它,然后加载该文件,以便它可以找到Message类。

问题是,它在该文件中找不到Message类,只有Mailboxer::Message类(完全不同)。这就是为什么它会抛出&#34;无法自动加载常量消息,期望/app/models/message.rb来定义它&#34;。

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

答案 1 :(得分: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"]

答案 2 :(得分:1)

我在集成测试期间得到了这个。事实证明,这与灯具有关。不得不删除/test/fixtures/wrong_name.yml中未使用的文件

答案 3 :(得分: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