Pregunta

Tengo la agencia modelo basada en el dispositivo:

class Agency < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  attr_accessible :name, :email, :phone, :address, :city, :state, :zip,
                  :notes, :is_admin, :password, :password_confirmation, :remember_me

  protected

  def password_required?
   !persisted? || password.present? || password_confirmation.present?
  end
end

También tengo la AgenciaController basada en Active_Scaffold:

class Admin::AgenciesController < Admin::BaseController
  before_filter :authorize_admin!

  active_scaffold :agency do |conf|
    actions.exclude :show

    create.link.page = true
    update.link.page = true

    list.columns = [
      :name, :email, :phone, :address, :city, 
      :state, :zip, :notes, :events, :is_admin
    ]

    create.columns = [
      :name, :email, :phone, :address, :city, :state, :zip, 
      :is_admin, :password, :password_confirmation
    ]

    update.columns = [
      :name, :email, :phone, :address, :city, :state, :zip, 
      :is_admin, :password, :password_confirmation
    ]

    columns.add :password
    columns.add :password_confirmation    

    columns[:password].form_ui = :password
    columns[:password_confirmation].form_ui = :password
  end
end 

Entonces aquí está el formulario de actualización de la agencia:
enter image description here

Me gustaría brindarle una oportunidad para que el usuario omite el llenado de campos de contraseña y contraseña_confirmación. Pero si el usuario llena el campo de la contraseña, el campo de contraseña_confirmación debe ser requerido.

Casi resolví mi problema por contraseña_Required? método. Pero la verificación requerida de JavaScript en el cliente no me permite solucionar mi problema por completo.

enter image description here

¿Cómo puedo eliminar la varificación JS del cliente para los campos de contraseña y contraseña_confirmación?

¿Fue útil?

Solución

Tratar:

validates_confirmation_of :password, :if => :password_required?

validates :password_confirmation, :presence => true, :if => '!password.nil?'

Tenga en cuenta que la validación solo se activa si password_required? Devuelve verdadero, y password_required? devolverá falso si el password_confirmation El campo es nulo.

Así que para hacer password_confirmation campo para ser nil, simplemente necesitas eliminar el password_confirmation El campo del formulario y de esa manera siempre lo obtendrás, evitando así pasar por alto las validaciones.

Soluciones alternativas:

1) Saltar la validación del campo de contraseña

2) Simplemente guarde un número generado seguro al azar en el campo de la contraseña (mejor porque es fácil y también mantiene la consistencia).

self.password = self.password_confirmation = SecureRandom.urlsafe_base64(n=6)

Además, si desea que estos campos sean identificados de manera diferente, como lo ha dejado el usuario, puede darles contraseñas únicas, así que, más tarde, usted impone la condición como:

if(self.password == "something unique" and self.password_confirmation == "something unique")
    flash[:notice] = "The user has not password"
end

Luego, en el nivel de UI, simplemente se muestra con en blanco usando la condición anterior.

Otros consejos

@Saurabh Jain, muchas gracias por tus consejos.
Pero la solución era mucho simple.
He descubierto que Active_Scffold agrega un atributo requerido para la etiqueta de entrada del campo de contraseña.
Por otras palabras que un cliente recibe un HTML

<input type="password" required="required" size="30" name="record[password_confirmation]" id="record_password_confirmation_4" class="password_confirmation-input text-input" autocomplete="off">

El atributo exactamente requerido fue mi problema :) Para eliminarlo de HTML, simplemente agregue la línea

columns[:password].required = false;

Para activar_scaffold Configuration en Admin :: AgenciasController (verlo arriba)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top