8

我严重卡在我有用户和个人资料模型的问题上。无论我尝试什么,似乎都不会为任何 Profile 属性触发验证

  • 配置文件模型属于用户。用户 has_one 个人资料
  • 在注册表单上使用 fields_for 显示一些个人资料字段(性别、城市和国家)
  • 无论我尝试了什么,我都无法让性别和城市的验证工作( fields_for 个人资料字段)

我的表格:

- 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) + " »"

我的用户模型有这个:

  accepts_nested_attributes_for :profile

我的带有验证的 Profile 模型如下:

  validates_presence_of :gender
  validates_presence_of :city
  validates_presence_of :country

我的参数:

-- !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

Rails 控制台可以:

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> 

-- 2012 年 7 月 19 日更新

我添加了

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

到表单查看到底发生了什么,这会引发以下错误列表:

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 

因此,似乎检查了验证....但是没有应用错误样式!个人资料也无效???我不确定,但这是否指

4

3 回答 3

3

首先,您粘贴的参数包括配置文件的城市、国家和性别的值。如果这是准确的,那么验证应该通过,因为Profile模型验证了这 3 个字段的存在——并且它们存在。

我还注意到您正在resource.build_profile视图中进行操作,这应该建立一个属于用户的默认配置文件。如果在实例化期间在配置文件中分配了任何值,这将导致它们进入表单,并最终进入 params 哈希。

所以我的猜测是你正在沿着这条线的某个地方填充字段,也许在UserorProfile模型中。您应该再次检查这些,特别是在新配置文件的初始化期间。

从你提供的数据中,我只能猜到这些。如果您仍然找不到问题,您可以尝试将它(或重现问题的单独应用程序,如果您不愿意分享您的真实应用程序)提交到 GitHub,以便我们可以更直接地分析问题。

编辑:刚刚注意到,在您的赏金中,您写道:

任何人都可以提供嵌套资源和验证的工作示例

因此,请参阅https://github.com/sinisterchipmunk/rubytastic以获取使用配置文件的嵌套属性进行用户验证的简单示例,以您的问题为模型。它验证User#emailProfile#city和。Profile#countryProfile#gender

于 2012-07-15T20:49:05.210 回答
2

检查数据库集中是否有任何默认值。似乎在表单参数中,您已粘贴问题,性别已male传递值。即使您没有检查任何性别,此表单参数是否也通过了?在这种情况下,这必须是数据库中的性别字段必须具有性别的默认值的情况male。在这种情况下,即使是一个新的Profile模型对象,其性别属性也会为male,因此它将通过验证并将性别保存male在数据库中。例如,我is_admin在 users 表中有一个布尔字段,并将其默认值设置为falseor 0。然后,如果我这样做:

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

您可以看到该is_admin属性设置为false而不是nil. 现在,如果我们不为 传递任何值is_admin,这里它将被保存为false数据库中,并且也不会触发is_admin字段验证,因为它存在于对象的属性中(带有值false)。

于 2012-07-13T09:09:39.370 回答
0

现在花了很多时间试图解决这个问题,根据这个主题中的建议,解决方案非常简单,我发现不是

错误的:

- resource.build_profile

正确的:

- resource.build_profile unless resource.profile

这样做不是清理配置文件,而是使用旧的配置文件(如果可用)......所以不清除所有错误!希望这对将来的某人有所帮助!

于 2012-07-19T16:33:10.310 回答