9

Hola, estoy tratando de configurar una validación que solo se llame en una vista de formulario específica, para hacer esto, intento crear un hidden_field para un atributo virtual en el formulario y establezca esto en un valor, luego valide: si el atributo virtual es igual al valor.Rails 3: crear una validación con: if statement

hasta ahora tengo:

## user model 

validates_presence_of :password_confirmation, :if => :confirmation_validation 

attr_accessible :email, :password, :password_confirmation, 
:remember_me, :name, :avatar, :username, :bio, :confirmation_validation 

def confirmation_validation 
# not sure what goes here??? 
end 


## form view 


<%= form_for(resource, :validate => true, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }, :html => {:multipart => true}) do |f| %> 
<%= devise_error_messages! %> 

<p><%= f.label :password %> <i>(leave blank if you don't want to change it)</i><br /> 
<%= f.password_field :password %></p> 

<p><%= f.label :password_confirmation %><br /> 
<%= f.password_field :password_confirmation %> 
<% f.hidden_field :confirmation_validation, :value => 100%></p> 

<p><%= f.submit "Update" %></p> 
<% end %> 

Respuesta

14

El valor del campo oculto confirmation_validation deben incluirse en el params hachís, y también establecer el atributo virtual en consecuencia. Por lo tanto, es probable que pueda comprobar simplemente si o no el valor se ha establecido:

validates_presence_of :password_confirmation, :if => :should_confirm? 

def should_confirm? 
    confirmation_validation == '100' # Value of the hidden field as set in the form 
end 
+0

Hey, lo anterior está mostrando un error para mí y es la siguiente el error. No se pueden asignar atributos probados en masa. ¿Por qué? –

+1

@Rajesh Agregue: password_confirmation a su attr_accessible. – scarver2

1

Esta respuesta es muy tarde, pero para el futuro para que los espectadores, creo que la respuesta a la pregunta @Rajesh

Hey , lo anterior muestra un error para mí y el error aparece a continuación. No se pueden asignar en masa atributos protegidos. ¿Por qué?

Es necesario quitar el campo oculto que está utilizando como indicador del params hash antes de asignarlo al registro. Algo así como

params.reject{|p| p == name_of_hidden_field} 
5

escribe un código de línea, podría ayudarle a organizar su código de forma simple.

validates_presence_of :password_confirmation, :if => lambda {|u| confirmation_validation == '100'} 

o

validates_presence_of :password_confirmation, :if => Proc.new {|u| confirmation_validation == '100'}