3

これは 2 つの部分からなる質問です。

検証を書いているモデルが継承されている場合、パート1はそのクラス内でActiveRecord::Base行う必要がありinclude ActiveModel::Validationsますか?? RailsのAPIには記載されていませんが、ここのyehudakatzブログではそれが示唆されているようです。

パート 2 は、これらのバリデータ ファイルを配置するのに最適な場所はどこですか? ヘルパーの下、または新しいモデルとして、または lib で?

私の現在のバリデータは次のようになります

class GenderValidator < ActiveModel::validator
  def validate(record)
    cred = /(\d{6})(\d{4})(\d{1})(\d{2})/.match(record.id_number.to_s) #breaks up the id into the relevent sections namely birthdate, gender, nationality, validator.
    unless cred[0][/\d{13}/] #checks to see if the id is a valid length of numbers if it isnt then skip the validation of gender
      return true
    else
      birthdate = cred[1] #returns a 6 digit string 'yymmdd'
      parsed_gender = cred[2] #returns a 4 digit string '0001-4999:female 5000-9999:male'
      nationality = cred[3] # should return either a 1 or a 0 1 if the person is foreign or 0 if the person is southafrican

      validate_gender(parsed_gender, record)
    end
  end

  private
  def validate_gender(parsed_gender, record)
    calculate_gender = (parsed_gender <= 4999 ? :female : :male)
      unless employee.gender == calculate_gender
        employee.errors[:gender] << "Your id indicates you have entered the wrong gender"
      end
  end
end

各人の有効な ID 番号はオプションですが、指定する場合は、性別が正しいかどうかを確認する必要があります。

従業員モデルと同じモデルに保持すると、このエラーが発生します

ActionController::RoutingError (uninitialized constant Employee::GenderValidator):
app/models/employee.rb:25:in `<class:Employee>'
app/models/employee.rb:1:in `<top (required)>'
lib/role_requirement_system.rb:19:in `inherited'
app/controllers/employees_controller.rb:1:in `<top (required)>'
librato-rails (0.8.1) lib/librato/rack/middleware.rb:12:in `call'

だから私はそれらが同じファイルにあることはできないと思います。検証のベストプラクティスは何ですか? 私はすべてのレールキャストを見て、いくつかのブログを読みましたが、まだまったく新しいです。

編集

私のモデルでは、このクラスを次のように含めます

include ActiveModel::Validations

私の検証は次のようになります

validates_presence_of :name, :position, :gender
validate :instance_validations, :on => :create

def instance_validations
  validates_with GenderValidator    
end

あなたもそれを見たいと思っていた場合に備えて、先に感謝します!

4

1 に答える 1

8

ActiveModel::Validations を含める必要はありません

モデルフォルダーに検証オブジェクトを保持することを好みます。

したがって、モデル Gender には、gender.rb ファイルがあります。

バリデーター GenderValidator には、gender_validator.rb ファイルがあります。

そのため、両方のファイルがモデル フォルダー内に一緒に配置されます。

これが私のニュースレターモデルのバリデーターです

class NewsletterValidator < ActiveModel::Validator
  def validate(record)
      if record.send_test_email
        if test_email_address.blank?
          record.errors[:test_email_address] << "Test email address is blank"
        end
        if record.send_email_to_subscribers
          record.errors[:send_test_email] << "You cannot send a test and send to subscribers at the same time"
        end
      end

  end
end

私のニュースレターモデルでは、単純に

  validates_with NewsletterValidator

あなたの例にはスペルミスがあります

あなたが持っている

class GenderValidator < ActiveModel::validator

そのはず

class GenderValidator < ActiveModel::Validator

大文字の V に注意してください

于 2013-02-25T16:09:05.557 に答える