Dans mon application; quand je soumets un formulaire, j'obtiens cette erreur:
LoadError at /questions
Unable to autoload constant Message, expected /app/models/message.rb to define it
Il pointe vers l'action create
dans le contrôleur Questions
:
@message = current_user.messages.new(:subject => "You have a question from #{@question.sender_id}"`
Modèle de message:
class Mailboxer::Message < ActiveRecord::Base
attr_accessible :notification_id, :receiver_id, :conversation_id
end
Par convention dans Rails (et cela est appliqué par l'autoloader), les chemins de fichiers doivent correspondre aux espaces de noms.
Donc, si vous avez un Mailboxer::Message
modèle, il devrait être en app/models/mailboxer/message.rb
.
En outre, l'autoloader est probablement actif lorsque vous essayez de charger une classe Message
(j'imagine que cela se produit depuis ActAsMessageable). Il cherche un message.rb
fichier dans le chemin de chargement, trouvez-le dans app/model/
et chargez donc ce fichier pour qu'il puisse trouver la classe Message
.
Le problème est, il ne trouve pas une classe Message
dans ce fichier, seulement un Mailboxer::Message
classe (qui est radicalement différente). C’est pourquoi il lance le message "Impossible de charger automatiquement le message constant, attendu /app/models/message.rb pour le définir".
Pour résoudre ce problème, créez le répertoire app/models/mailboxer/
et met Mailboxer::Message
dedans.
Je l'ai eu lors des tests d'intégration. Il s'avère que c'était lié aux appareils. J'ai dû supprimer le fichier inutilisé dans /test/fixtures/wrong_name.yml
Comme indiqué dans la documentation, pour envoyer un message de A
model à B
model, vous devez ajouter:
acts_as_messageable
dans les deux modèles.
Et ensuite faire:
a.send_message(b, "Body", "subject")
Donc dans vos modèles:
class User < ...
act_as_messageable
end
@question_sender
doit être une instance User
.
@question_sender.send_message({attr_accessor_hash}, recipient_user, @question.body, "You have a question from #{@question_sender.id}")
Tant que le attr_accessor
n'est pas lié à la gemme, et la méthode send_message ne connaît pas ces attributs, vous devrez le redéfinir:
https://github.com/mailboxer/mailboxer/blob/master/lib/mailboxer/models/messageable.rb#L6
ajoute la méthode attr_accessor_hash à la méthode
def send_message({attr_accesor_hash}, recipients, msg_body, subject, sanitize_text=true, attachment=nil, message_timestamp = Time.now)
Et regardez le code ajoutez les champs où vous avez besoin comme: attr_accessor["param"]
Remarquez ces lignes.
@question = Question.new(params[:question])
@question.message = @message
et ;
attr_accessible :answer, :question, :sender_id, :recipient_id, :conversation_id
La ligne @question.message
Appelle un attribut qui n'est pas accessible dans le Question Model
.
attr_accessible :answer, :question, :sender_id, :recipient_id, :conversation_id, message