He creado recientemente una aplicación que tiene artículos, etc., con un sistema de comentarios/moderación en la parte superior. Hay una de tres cosas que suceden cuando un usuario deja un comentario.Ruby on Rails/Devise: Determinación en el modelo si el usuario está conectado
La primera es si son usuarios registrados y han iniciado sesión a través de Devise, su comentario se marca con un estado de '2' y se publica de inmediato. Si es un usuario anónimo con un comentario previamente aprobado con una dirección de correo electrónico coincidente, el comentario obtiene el estado de '1' y se pone en una cola de moderación para su aprobación. Y si el usuario es completamente nuevo y su correo electrónico no está en el sistema, ese comentario obtiene un estado de '0' y se envía un correo electrónico a su bandeja de entrada para hacer clic en un enlace para aprobar su correo electrónico. Después de esto, se muestra un aviso/mensaje flash apropiado.
Tengo todo esto funcionando bien, pero hice casi toda la definición lógica y variable en el controlador, lo que hace que la acción de crear sea muy gorda. Con el interés de aprender las mejores prácticas y la convención del "modelo gordo, controlador delgado", trato de mover la lógica que pueda al modelo de comentarios, particularmente la parte que se da cuenta si están conectados o qué. Así que, hipotéticamente, algo como esto en el modelo ...
attr_accessor :message
before_create :poster_type
def poster_type
if current_user
self.status = 2
self.message = 'Your comment has been posted.'
elsif Comment.find_by_mail(self.mail, :conditions => { :status => [1,2]}).present?
self.status = 1
self.message = 'Your comment has been sent for moderation.'
else
self.status = 0
self.message = 'This is a new email, please confirm...'
end
end
El problema es que no se puede utilizar el método de Diseñar current_user (o otros como user_signed_in ?, etc.) en el modelo, por lo visto. Cada respuesta que he investigado sobre esto dice inútilmente que no es asunto del modelo acceder a los valores del usuario actual, etc.
Sin embargo, no necesito proporcionarle a la modelo la información de un usuario (ya que visto todos los otros hilos tratando de hacerlo), todo lo que necesito el método en el modelo para averiguar es simplemente si están conectados o no.
Además, si no puede usar current_user (u otros métodos de detección de usuario) en el modelo, entonces no tendría otra opción que definir toda la lógica en el controlador, y no es tan mala práctica como ¿bien? Entonces, si es posible, ¿cómo puedo hacer esta lógica en el modelo? ¿O simplemente debería dejar el controlador gordo?
Tengo un controlador llamado customers_controller.rb y un modelo customer.rb ¿cómo puedo implementar la verificación de condición como si user_signed_in? // si signed_in es verdadero // mi código de validación aquí elsif! user_signed_in? // si signed_in es falso // mi código de validación aquí else // mi código de validación aquí final –
Tengo un problema similar, ¿cómo puedo publicarlo como problema? –