8

私はあなたがそれらを呼びたいものは何でもネストされた関連/属性を持っているサインアップフォームを持っています。

私の階層はこれです:

class User < ActiveRecord::Base
  acts_as_authentic
  belongs_to :user_role, :polymorphic => true
end

class Customer < ActiveRecord::Base
  has_one :user, :as => :user_role, :dependent => :destroy
  accepts_nested_attributes_for :user, :allow_destroy => true
  validates_associated :user
end

class Employee < ActiveRecord::Base
  has_one :user, :as => :user_role, :dependent => :destroy
  accepts_nested_attributes_for :user, :allow_destroy => true
  validates_associated :user
end

これらのクラスにもいくつかの検証機能があります。私の問題は、空白のフォームで顧客(または従業員など)を作成しようとすると、すべての検証エラーに加えて、「ユーザーが無効です」や「顧客が無効です」などの一般的なエラーが発生することです。私が得るエラーは次のようなものです:

user.login can't be blank
User is invalid
customer.whatever is blah blah blah...etc
customer.some_other_error etc etc

ネストされたユーザーモデルには少なくとも1つの無効なフィールドがあるため、エラーのリストに「Xは無効です」というメッセージが追加されます。これは私のクライアントを混乱させるので、自分でエラーをファイリングする代わりに、これを行うための迅速な方法があるかどうか疑問に思っています。

4

2 に答える 2

6

サリルの答えはほぼ正しかったが、彼はそれを100%達成したことはなかった。これを行う正しい方法は次のとおりです。

def after_validation
    # Skip errors that won't be useful to the end user
    filtered_errors = self.errors.reject{ |err| %{ person }.include?(err.first) }

    # recollect the field names and retitlize them
    # this was I won't be getting 'user.person.first_name' and instead I'll get
    # 'First name'
    filtered_errors.collect{ |err|
      if err[0] =~ /(.+\.)?(.+)$/
        err[0] = $2.titleize
      end
      err
    }

    # reset the errors collection and repopulate it with the filtered errors.
    self.errors.clear
    filtered_errors.each { |err| self.errors.add(*err) }
  end
于 2010-09-14T08:39:39.293 に答える
3

after_validationメソッドを使用する

  def after_validation
    # Skip errors that won't be useful to the end user
    filtered_errors = self.errors.reject{ |err| %w{ user User  }.include?(err.first) }
    self.errors.clear
    filtered_errors.each { |err| self.errors.add(*err) }
  end

編集済み

ノート:-

ユーザーまたはユーザーの場合は、次のリストに追加します。スペースで区切られた複数の関連付けがある場合は、複数を追加できます。

%w{ User user }.include?(err.first) #### This piece of code from the above method has logic which reject the errors which won't be useful to the end user
于 2010-06-01T05:26:35.523 に答える