8

Estoy realmente atascado en un problema donde tengo un modelo de usuario y perfil. lo que intento parece validaciones no se activan para cualquiera de los atributos del perfilgrave atascado en: validaciones no activadas para el recurso anidado con fields_for

  • El modelo de perfil pertenece al usuario. Perfil
  • El formulario de registro utilizando fields_for tener algunos campos de perfil que se muestran (de género, y la ciudad y país)
  • Lo he intentado, soy incapaz de dejar el trabajo de validación para género y la ciudad (el perfil del usuario fields_for has_one campos)

Mi forma:

- title t(:title, :scope => :register) 
%h1= yield(:title) 

    = simple_form_for(resource, :as => resource_name, :html => { :class => 'form-horizontal' } , :validate => true , :url => registration_path(resource_name)) do |f| 

    = f.input :username,     :label => t(:username) 
    = f.input :email,      :label => t(:email), 
              :hint => t(:hint_email_visible) 
    = f.input :password,     :label => t(:password), :require => true 
    = f.input :password_confirmation,  :label => t(:password_confirm) 


    - resource.build_profile 
    = f.fields_for :profile do |f| 

     #div 

     = f.hidden_field :form, :value => "signup" 

     .clear 

     = f.input :gender,    :collection => [['Male', 'male'], ['Female', 'female']], 
              :as => :radio 

    = f.input :city, 
       :readonly => "readonly", 
       :label => t(:city) 

    .ruler 

    = f.input :country, 
       :label => "Your country", 
       :collection => [DataCountry.where(:code => 155).first], 
       :value => @city, 
       :id => "country", 
       :name => "country" 

    .clear 


    = f.button :submit, t(:submit, :scope => :register) + " »" 

Mi modelo de usuario tiene esto:

accepts_nested_attributes_for :profile 

Mi Modelo de perfil con validaciones es como:

validates_presence_of :gender 
    validates_presence_of :city 
    validates_presence_of :country 

Mis PARAMS: consola

-- !ruby/hash:ActiveSupport::HashWithIndifferentAccess 
utf8: ✓ 
authenticity_token: <mytokenhere> 
user: !ruby/hash:ActiveSupport::HashWithIndifferentAccess 
    invite_code: '' 
    username: username 
    email: '' 
    password: '' 
    password_confirmation: '' 
    profile_attributes: !ruby/hash:ActiveSupport::HashWithIndifferentAccess 
    form: signup 
    gender: male 
    dob(3i): '9' 
    dob(2i): '7' 
    dob(1i): '1942' 
    city: 'somevalue' 
    country: 'somevalue' 
commit: Register » 
action: create 
controller: registrations 

rieles hace:

User.new 


=> #<User id: nil, email: "", encrypted_password: "", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, password_salt: nil, confirmation_token: nil, confirmed_at: nil, confirmation_sent_at: nil, unconfirmed_email: nil, failed_attempts: 0, unlock_token: nil, locked_at: nil, authentication_token: nil, username: nil, is_blocked: nil, is_deleted: nil, role: nil, slug: nil, created_at: nil, updated_at: nil, last_seen: nil, credits: nil, invite_code: nil, is_moderated: nil, locale: nil, status: nil, login_token: nil> 

Profile.new

=> #<Profile id: nil, user_id: nil, gender: nil, country: nil, state: nil, city: nil, status: nil, counter_cache: nil> 

- Actualización 19 de Jul '12

he añadido el

- @user.errors.full_messages.each do |message| 
    = message 
    .clear 

Para la forma de ver qué es exactamente lo que está sucediendo y esto arroja el siguiente lista de errores:

Email can't be blank 
Email can't be blank 
Password can't be blank 
Password can't be blank 
Profile city can't be blank 
Profile gender can't be blank 
Profile is invalid 
Username can't be blank 
Password confirmation can't be blank 

Parece que la validación está marcada .... ¡Pero no se aplica ningún estilo de error! Además, el perfil no es válido ??? No estoy seguro, pero eso se refiere a

+0

Intenta cambiar a 'validates_inclusion_of: gender, in:% w (male female)' y mira si te da un mensaje de error –

+0

Thx lo intentó sin éxito. Lo intento con algunos otros campos de perfil que agregaré al formulario, quizás sea un problema relacionado con el género – Rubytastic

+1

¿Has intentado poner 'validates_associated: profile' en tu modelo' User'? – HargrimmTheBleak

Respuesta

0

Muchas horas pasan tratando de arreglar esto ahora la solución se muy sencilla basada en las sugerencias en este tema descubrí que en lugar de

MAL:

- resource.build_profile 

CORRECTO:

- resource.build_profile unless resource.profile 

qué esto no limpia el perfil, sino que usa el anterior si está disponible ... ¡así que no se borran todos los errores! ¡Espero que esto ayude a alguien en el futuro!

2

Compruebe si tiene algún valor predeterminado en el conjunto de la base de datos. Parece que en los parámetros del formulario, ha pegado en la pregunta, el género tiene el valor male pasado. ¿Se aprobaron los params de esta forma incluso cuando no verificaste nada por género? En ese caso, este debe ser un caso donde el campo de género en la base de datos debe tener el valor predeterminado para el género como male. En ese caso, incluso un nuevo objeto modelo Profile tendrá su atributo de género como male, por lo que pasará las validaciones y guardará el género como male en la base de datos. Por ejemplo, tengo un campo booleano is_admin en la tabla de usuarios y establezco su valor predeterminado como false o 0.Entonces, si lo hago:

User.new 
=> #<User id: nil, name: nil, email: nil, is_admin: false> 

Se puede ver el atributo is_admin se establece en false en lugar de nil. Ahora bien, si no pasamos ningún valor para is_admin, aquí se guardará como false en la base de datos y tampoco activará la validación del campo is_admin, ya que está presente en los atributos del objeto (con valor false).

+0

Comprobé esto, pero este no es el caso, el género no está configurado – Rubytastic

+0

Actualizado con salida exacta – Rubytastic

+0

@Rubytastic: Usted ha dado el objeto 'User.new'.' Gender' está en la tabla de perfiles, ¿verdad? ¿Puede verificar la salida de 'Profile.new'? – rubyprince

3

En primer lugar, los parámetros que pegó incluyen valores para la ciudad, el país y el género del perfil. Si esto es correcto, la validación debe pasar, porque el modelo Profile valida la presencia de estos 3 campos, y están presentes.

También observo que está haciendo resource.build_profile en la vista, que debe crear un perfil predeterminado que pertenezca al usuario. Si se asignan valores en el perfil durante la creación de instancias, esto les haría ingresar al formulario y, finalmente, al hash de parámetros.

Así que supongo que está poblando los campos en algún lugar de la línea, tal vez en los modelos User o Profile. Debería verificarlos nuevamente, particularmente durante la inicialización de un nuevo perfil.

Eso es todo lo que puedo adivinar de los datos que ha dado. Si aún no puede encontrar el problema, puede intentarlo (o una aplicación por separado que reproduzca el problema, si no se siente cómodo compartiendo su aplicación real) con GitHub para que podamos analizar el problema de manera más directa.

EDIT: acabo de dar cuenta, en su generosidad que escribió:

cualquiera puede proporcionar un ejemplo de trabajo [de] los recursos anidados y validaciones

Así, consulte https://github.com/sinisterchipmunk/rubytastic para un ejemplo simple de usuario validación con atributos anidados para un perfil, modelado después de su pregunta. Valida User#email, Profile#city, Profile#country y Profile#gender.

+0

Si dejo los 3 campos vacíos, la forma todavía va lidates, no hay errores (establecí los 3 campos de perfil necesarios). Es mucho por el comentario y tomarse un tiempo para escribir un ejemplo. Los reviso mañana con todo detalle e informo en ese momento. THX otra vez – Rubytastic

+0

Utilicé el código de bucles de todos los errores de su ejemplo, no pensé por un segundo en probar que parece que el estilo de error no se aplica. Entonces los campos no son válidos pero no hay CSS, los formularios no se vuelven a llenar. Voy a quitar mi modelo de perfil ahora para ver si algún código está causando estos problemas. – Rubytastic

+0

Sí, Rails 2 tenía un método '<% = f.error_messages%>', pero se eliminó en Rails 3 porque el equipo central consideró que era demasiado "mágico", en el sentido de que nadie entendió realmente lo que hacía. Así que ahora tienes que estilizarte a ti mismo, pero de todos modos no es mucho más trabajo. Es posible que los formularios no se vuelvan a llenar debido a su 'resource.build_profile', que podría sobrescribir el perfil anterior (no válido) con uno nuevo (en blanco). – sinisterchipmunk

Cuestiones relacionadas