signup - Ruby on Rails/Devise: omitir la opción de validación personalizada en el modelo al restablecer la contraseña
instalar devise rails (3)
En mi proyecto, alteré el formulario de registro en Devise para agregar una opción: acordar a través de un descriptor de acceso (el usuario debe aceptar los términos de servicio para registrarse, etc.). Si no están de acuerdo, no valida.
Eso causó un problema cuando un usuario intentó editar la información de su cuenta cuando buscaba: acordar validación, pero pude agregar una cláusula ''a menos'' y agregué otro acceso llamado: signed_in que está definido en el controlador (no pude) Para averiguar cómo conseguir que el modelo determine si el usuario inició sesión o no, los ayudantes del diseñador no funcionarían para mí. Las partes relevantes de mi modelo de usuario y control de usuarios parecen ...
usuario.rb
validates :agree, :term_agreement => TRUE, :unless => :signed_in
users_controller.rb
def update
@user = User.find(params[:id])
if user_signed_in?
@user.signed_in = params[:user]
end
[...]
end
Entonces, todo funciona bien ... la validación "de acuerdo" anula cuando un usuario ya inició sesión. Sin embargo, tengo que encontrar la mejor manera de anular otro escenario ... cuando un usuario restablece su contraseña y necesita cambiarla. eso.
Estaba probando cuentas de usuario y traté de restablecer mi contraseña en una cuenta, sin embargo, recibí la siguiente confirmación: acordar la validación ... ahora tengo que encontrar la manera de anularla. Noté que el formulario Cambiar su contraseña tiene un valor de campo oculto de: reset_password_token, sin embargo lo intenté: unless =>: reset_password_token pero no funcionaría.
Entonces, ¿cuál es la mejor manera de lograr esto? Además de eso, ¿cómo puedo tener una condición de ambos lados (a menos que: signed_in o: reset_password, etc.) para eso: a menos cláusula?
Entonces, ¿necesita validar la aceptación de los términos cuando se crea el registro?
class User < ActiveRecord::Base
validates :agree, :acceptance => true, :on => :create
end
:on => :create
solo realizará esa validación cuando se cree el registro, muy parecido a la respuesta de Brandon, pero sin código redundante.
Esto también evitará la necesidad de que sus controladores se preocupen si un usuario inicia sesión o no.
Lo solucioné configurando el dispositivo para actualizar los atributos de la contraseña que dirigen si la validación falló, pero solo si los atributos de la contraseña están libres de errores.
Vea mi respuesta aquí:
Los errores de validación se activan cuando intento restablecer la contraseña
Prefiero basar este tipo de cosas en si el registro es nuevo o no (que es la única vez que el usuario se "registrará").
class User < ActiveRecord::Base
validates :agree, :term_agreement => TRUE, :if => :signing_up?
# Return true if the user is currently signing up
def signing_up?
new_record?
end
end
La clave es tener en cuenta que el valor de :if
y :unless
sea "un método, proceso o cadena para llamar para determinar si la validación debería [o no] ocurrir", por lo que puede definir métodos en su modelo para este propósito.