2011-07-19 15 views
5

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?

Respuesta

7

No puede acceder al usuario o la sesión de diseño desde ningún modelo debido a la separación de capas. Lo que puedes hacer es enviar el objeto al modelo.

He hecho algo parecido a su solución antes y fue solo un dolor de cabeza.

Entonces en su acción de crear.

def create 
    if current_user 
     @user.current_user(true) 
    end 
end 

A continuación, sólo enviar verdadero/falso a un método en el usuario:

def current_user(current_user) 
    current_user 
end 

, entonces puede tener un before_create que comprueba si eso es cierto.

+0

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 –

+0

Tengo un problema similar, ¿cómo puedo publicarlo como problema? –

Cuestiones relacionadas