ruby-on-rails - realizan - validaciones rails
Rieles: valide solo en crear o en actualizar cuando el campo no esté en blanco (4)
Esto resultó ser un poco más simple de lo que pensaba. Cambié los nombres de entrada del formulario de password
y password_confirmation
a new_password
y new_password_confirmation
. Agregué accesores temporales para estos valores en mi modelo usando la siguiente línea:
attr_accessor :new_password, :new_password_confirmation
He implementado un password_changed?
Método definido de la siguiente manera:
def password_changed?
!new_password.blank?
end
Finalmente, cambié mis validaciones a:
validates :new_password, presence: true, confirmation: true, length: { in: 6..20 }, on: :create
validates :new_password, presence: true, confirmation: true, length: { in: 6..20 }, on: :update, if: :password_changed?
validates :new_password_confirmation, presence: true, on: :create
validates :new_password_confirmation, presence: true, on: :update, if: :password_changed?
Estoy seguro de que hay una mejor manera de hacer esto (esto no es muy SECO) pero por ahora, funciona. Respuestas mejoradas todavía serían muy apreciadas.
¿Cómo puedo restringir una validación de Rails para verificar solo en crear O cuando el campo no está en blanco? Estoy creando una página de configuración de usuario para una aplicación en la que estoy trabajando y el problema es que, al actualizar utilizando los parámetros proporcionados por el formulario, la configuración solo se guardará cuando haya una contraseña y una confirmación de contraseña. Me gustaría que estos campos de contraseña se validen en la creación sin importar qué, pero solo en la actualización cuando se proporcionan.
No es necesario cambiar los nombres de los campos, será suficiente para reemplazar :password_changed?
a :password_digest_changed?
en su codigo
validates :password, presence: true, confirmation: true, length: { in: 6..20 }, on: :create
validates :password, presence: true, confirmation: true, length: { in: 6..20 }, on: :update, if: :password_digest_changed?
validates :password_confirmation, presence: true, on: :create
validates :password_confirmation, presence: true, on: :update, if: :password_digest_changed?
Por favor, inténtalo
validates :<attributes>, if: Proc.new{|obj| obj.new_record? || !obj.<attribute>.blank? }
o agregue nombres de métodos personalizados en lugar de nombres de atributos.
Si desea permitir valores en blanco use: allow_blank with validates.
class Topic < ActiveRecord::Base
validates :title, length: { is: 5 }, allow_blank: true
end
Si desea validar solo en crear, use on con validates.
class Topic < ActiveRecord::Base
validates :email, uniqueness: true, on: :create
end
Para cubrir su caso:
class Topic
validates :email, presence: true, if: :should_validate?
def should_validate?
new_record? || email.present?
end
end