ruby-on-rails activemodel rails-models mailboxer

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.