Ahora me doy cuenta de que este tema ya se ha cubierto muchas veces. Sin embargo, no parecía haber una solución que deseara eximir el campo de contraseña actual solo cuando la contraseña en la base de datos estuviera en blanco.Ruby on Rails, gema de Devise. ¿Cómo eliminar la contraseña actual cuando la contraseña está en blanco?
tengo actualmente requiere la contraseña en mi modelo de usuario como:
def password_required?
(authentications.empty? || !password.blank?) && super
end
Entonces copiar la función de actualización a través en mi controlador de inscripciones:
def update
if resource.update_with_password(params[resource_name])
set_flash_message :notice, :updated
sign_in resource_name, resource, :bypass => true
redirect_to after_update_path_for(resource)
else
clean_up_passwords(resource)
render_with_scope :edit
end
end
yo sólo no saben cómo Asegurándome de que el dispositivo no necesita una contraseña al editar una contraseña en blanco, ¿también necesito eliminar el campo de contraseña actual de la vista y hacer esto?
<% if current_user.password_required? %>
<p><%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
<%= f.password_field :current_password %></p>
<% end %>
<p><%= f.submit "Update" %></p>
Cualquier sugerencia sería muy bien en esto como estoy seguro de que se me escapa algo, pero yo todavía soy nuevo en rieles en su conjunto. ¡Gracias!
'' devuelve 'current_user.has_no_password true' si no hay una contraseña, por lo tanto el if la instrucción ejecuta su bloque. Está utilizando un lenguaje negativo para validar esa afirmación ... debe escribir 'a menos que current_user.has_no_password?', Pero aún así es gracioso. Es una lectura más fácil si lo haces 'current_user.has_password?' Y establecer la definición para devolver 'self.encrypted_password.present?' (Me doy cuenta de que esto se ha discutido a continuación, pero esto pertenece a los comentarios, y he dado un alternativo , solución más legible) – wulftone
Utilicé esto como la base de otra cosa y funciona bastante bien.Solo cambio: tuve que eliminar 'if! Params [: current_password] .blank?' Para evitar errores en la asignación masiva, porque la contraseña actual se estaba configurando en '" "' (y por lo tanto 'blank? == true') así que no fue borrado de params, y luego 'update_attributes (params)' intentó actualizar el registro del usuario con ': current_password =>" "' - obviamente falla ya que 'current_password' no es un atributo del usuario ... Maybe Aunque tengo el lado equivocado del palo? Además, ¿el 'yo 'no es redundante? – dgmstuart
Probé esta solución, obtuve No puedo asignar en masa los atributos protegidos: contraseña_actual – simo