web-dev-qa-db-fra.com

LoadError Impossible d'autoloader Message constant

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
49
pwz2000

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.

94
kik

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

2
Jay

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"]

1
tebayoso

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