8

私はユーザーとプロファイルモデルを持っている問題に真剣に立ち往生しています。私が試したものは何でも、プロファイル属性のいずれに対しても検証がトリガーされていないようです

  • プロファイルモデルはユーザーに属しています。ユーザーhas_oneプロファイル
  • fields_forを使用した登録フォームで、いくつかのプロファイルフィールド(性別、都市と国)を表示します
  • 何を試しても、性別と都市の検証を機能させることができません(fields_for profile fields)

私のフォーム:

- 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

検証を含む私のプロファイルモデルは次のようになります。

  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

まず、貼り付けたパラメータには、プロファイルの都市、国、性別の値が含まれています。これが正確である場合、モデルはこれら3つのフィールドの存在を検証し、それらが存在するため、検証に合格する必要があります。Profile

また、ビューで実行していることにも注意してください。resource.build_profileこれにより、ユーザーに属するデフォルトのプロファイルが作成されます。インスタンス化中にプロファイルに値が割り当てられている場合、これにより、値がフォームに、そして最終的にはparamsハッシュに移動します。

だから私の推測では、あなたはラインに沿ったどこか、おそらくUserまたはProfileモデルのフィールドにデータを入力していると思います。特に新しいプロファイルの初期化中に、これらを再度確認する必要があります。

あなたが提供したデータから私が推測できるのはそれだけです。それでも問題が見つからない場合は、問題をGitHubにコミットしてみてください(または、実際のアプリを共有することに不安がある場合は、問題を再現する別のアプリを使用してください)。これにより、問題をより直接的に分析できます。

編集:あなたが書いたあなたの賞金でちょうど気づいた:

ネストされたリソースと検証の実用的な例を誰でも提供できます

したがって、質問に基づいてモデル化された、プロファイルのネストされた属性を使用したユーザー検証の簡単な例については、https://github.com/sinisterchipmunk/rubytasticを参照してください。User#email、、、およびをProfile#city検証します。Profile#countryProfile#gender

于 2012-07-15T20:49:05.210 に答える
2

データベース セットにデフォルト値があるかどうかを確認します。フォーム params で、質問に貼り付けた場合、gender に値maleが渡されたようです。性別を何もチェックしていない場合でも、このフォームのパラメーターは渡されますか? その場合、これは、データベースの性別フィールドに性別のデフォルト値が含まれている必要があるケースである必要がありますmale。その場合、新しいProfileモデル オブジェクトでも性別属性がmaleとなるため、検証に合格し、性別maleがデータベースに保存されます。たとえばis_admin、ユーザー テーブルにブール フィールドがあり、そのデフォルト値をfalseまたはに設定します0。次に、これを行うと:

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

is_admin属性がfalseではなく に設定されていることがわかりますnil。に値を渡さない場合is_admin、ここではデータベースにそのまま保存され、フィールドfalseの検証もトリガーされません。これは、オブジェクトの属性 ( value を使用) に存在するためです。is_adminfalse

于 2012-07-13T09:09:39.370 に答える
0

これを修正するのに何時間も費やしていますが、このトピックの提案に基づいて解決策は非常に簡単です。

違う:

- resource.build_profile

正しい:

- resource.build_profile unless resource.profile

これが行うことは、プロファイルをクリーンアップするのではなく、利用可能な場合は古いプロファイルを使用することです...したがって、すべてのエラーをクリーンアップするわけではありません! これが将来誰かに役立つことを願っています!

于 2012-07-19T16:33:10.310 に答える