2014-06-20 24 views
39

在我的应用程序;当我提交表单,我得到这个错误:LoadError无法自动加载常量消息

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 
+0

它看起来像一个命名空间问题。用户和消息之间的关系如何定义,“Message”模型定义在哪里? – Sharagoz

+0

@Sharagoz如果我从名称中删除了'Mailboxer ::',我得到错误'表'dating_development.messages'不存在'。这是有道理的,因为没有消息表,只有通知表。我只是意识到'Mailboxer :: Message'应该进入子目录,但如果我开始沿着这条路走下去,那么我会走错路。 – pwz2000

+0

你可以在问题中分享'用户'模型吗? –

回答

76

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

所以,如果你有一个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放入其中。

+1

感谢您的洞察力。我删除了消息模型,因为它不需要开始,但是你的观点是100%正确的。 – pwz2000

+0

YESSSSSSSS!我的一周搜索结束了。这太不合适了! –

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是不相关的宝石,并且该方法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"]

+0

它指向''未定义的方法'attr_accessible'为消息:类'' – pwz2000

+0

对不起,访问器 – tebayoso

+0

我无法使用accessor没有ActiveRecord,因为它给出错误“未定义的方法'arel_table'''指向行' @message = current_user.messages.new'。将AR添加回模型会给我''表'dating_development.messages'不存在''也指向同一行。 – pwz2000

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 
+0

我曾尝试过。它不幸地指向相同的错误。我认为这与我必须创建的消息模型有关。 – pwz2000

0

我在集成测试中得到了这个。原来,这是与灯具有关的。必须在/test/fixtures/wrong_name.yml中删除我未使用的文件

相关问题