私のアプリでは;フォームを送信すると、次のエラーが表示されます。
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
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
を入れます。
統合テスト中にこれを取得しました。結局のところ、それは関連する備品でした。 /test/fixtures/wrong_name.ymlにある未使用のファイルを削除する必要がありました
ドキュメントに記載されているように、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#L6
メソッドに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"]
これらの行に注意してください。
@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