ruby on rails - LoadError No se puede cargar automáticamente el mensaje constante
ruby-on-rails activemodel (4)
En mi aplicación; Cuando envío el formulario, recibo este error:
LoadError at /questions
Unable to autoload constant Message, expected /app/models/message.rb to define it
Apunta a la acción de create
en el controlador de Questions
:
@message = current_user.messages.new(:subject => "You have a question from #{@question.sender_id}"`
Modelo de mensaje:
class Mailboxer::Message < ActiveRecord::Base
attr_accessible :notification_id, :receiver_id, :conversation_id
end
Como se indica en la documentación, para enviar un mensaje del modelo A
modelo B
, debe agregar:
acts_as_messageable
En ambos modelos.
Y luego hacer:
a.send_message(b, "Body", "subject")
Así que en tus modelos:
class User < ...
act_as_messageable
end
@question_sender
debe ser una instancia de User
.
@question_sender.send_message({attr_accessor_hash}, recipient_user, @question.body, "You have a question from #{@question_sender.id}")
Mientras el attr_accessor
no esté relacionado con la gema, y el método send_message no tenga conocimiento de estos atributos, tendrá que redefinirlo:
https://github.com/mailboxer/mailboxer/blob/master/lib/mailboxer/models/messageable.rb#L60
agrega el attr_accessor_hash al método
def send_message({attr_accesor_hash}, recipients, msg_body, subject, sanitize_text=true, attachment=nil, message_timestamp = Time.now)
Y mire el código, agregue los campos donde lo necesite como: attr_accessor["param"]
Conseguí esto durante las pruebas de integración. Resulta que estaba relacionado con los accesorios. Tuve que eliminar el archivo no utilizado en /test/fixtures/wrong_name.yml
Note estas líneas;
@question = Question.new(params[:question])
@question.message = @message
y;
attr_accessible :answer, :question, :sender_id, :recipient_id, :conversation_id
La línea @question.message
está llamando a un atributo al que no se puede acceder en el Question Model
así que haga esto;
attr_accessible :answer, :question, :sender_id, :recipient_id, :conversation_id, message
Por convención en los rieles (y esto se aplica mediante el autocargador), las rutas de los archivos deben coincidir con los espacios de nombres.
Por lo tanto, si tiene un modelo de Mailboxer::Message
, debe estar en app/models/mailboxer/message.rb
.
Además, es probable que tenga un cargador automático al intentar cargar una clase de Message
(mi conjetura es que ocurre dentro de ActAsMessageable). Busca un archivo message.rb
en la ruta de carga, encuéntrelo en app/model/
y, por lo tanto, cargue ese archivo para que pueda encontrar la clase Message
.
El problema es que no encuentra una clase de Message
en ese archivo, solo una clase de Mailboxer::Message
(que es radicalmente diferente). Esta es la razón por la que lanza "No se puede cargar automáticamente el mensaje constante, se esperaba /app/models/message.rb para definirlo".
Para solucionarlo, cree la app/models/mailboxer/
directorio app/models/mailboxer/
y ponga Mailboxer::Message
en él.