4

私はRuby on Railsを初めて使用します。いくつかのフィールドを持つフォームがあるシナリオがあります。data を持つテーブルに対して検証する必要があるフィールド値の 1 つ。フィールドがテーブル レコードで検証されない限り、ユーザーがデータを保存できないように制限したいと考えています。

最初にそれを検証するためにコントローラーにコードを追加しましたが、空として検証する必要がある他のフィールドがあるため、機能しませんでした。

また、検証エラーを他のエラーの一部にしたいです。

モデルファイルで以下のコードを試しました

before_create :validate_company_id

def validate_company_id
    cp = Company.find_by_company_id(self.company)
    if @cp != nil
       return
     else
        self.status ||= "Invalid"    
     end
end

しかし、それは検証できません。検証方法を教えてください。

よろしくSurjan

4

3 に答える 3

18

彼らは正しく答えましたが、別の解決策を提供しました。「私のコードが実行されないのはなぜですか?」と自問することができます。

まず第一に、コードにエラーがあります -@cpは未定義です。また、 で何を達成しようとしているのかわかりませんself.status ||= "Invalid"

selfまた、属性を呼び出すときに使用する必要はありませんが、新しい属性値を割り当てるときに呼び出す必要があります。不要なのでself.company、そのまま使用できますcompany

また、テーブルにcompany_id属性があることにも気付きました。companiesこれは必須ではありません。一般的な規則では、代わりに ID のみを使用しています。テーブルを変更したくない場合は、次のidようにモデルにフィールドを設定できます。

class Company < ActiveRecord::Base
  set_primary_key :company_id

  # ... the rest of your model code ...
end

その後、Company.findの代わりに使用できますCompany.find_by_company_id

さて、修正後に次のコードがあるとしましょう。

before_create :validate_company_id

def validate_company_id
    cp = Company.find(company)
    if cp != nil
       return
     else
        self.status ||= "Invalid"    
     end
end

まず、ここで三項演算子を使用したいと思います

before_create :validate_company_id

def validate_company_id
    Company.find(company) ? return : self.status ||= "Invalid"
end

これはよりクリーンではありませんか?それはまったく同じことをします。

self.statusあなたのことについて。オブジェクトを無効にしたい場合は、ハッシュActiveModelにいくつかの値を設定する必要があります。errors「無効」のステータス属性を持つモデルが無効であると考えるのは誤解です。Rails では今でも完全に有効なモデルです。

では、どうやって無効化するのですか?

いくつかの値をerrorsハッシュに入れます。検証エラーが参照するメッセージと属性を指定することもできます。

それでは、あなたのモデルでそれをしましょう

before_create :validate_company_id

def validate_company_id
    Company.find(company) ? return : errors.add(:company,"Invalid Company ID")
end

これで、無効な company_id でモデルを保存しようとしても、それは渡されて DB に保存されます。何故ですか?

これは、ActiveModels のライフサイクルによるものです。メソッドの呼び出しが遅すぎます。

使用できるすべてのコールバック メソッドを次に示します。

作成

before_validation
after_validation
before_save
around_save
before_create
around_create
after_create
after_save

更新中

before_validation
after_validation
before_save
around_save
before_update
around_update
after_update
after_save

破壊

before_destroy
around_destroy
after_destroy

メソッドが検証サイクルのかなり後に呼び出されることに注目してください。したがって、代わりにbefore_create, but after_validationorコールバックを使用しないでください。before_validation

これで、モデルの有効な検証方法が完成しました。

after_validation :validate_company_id

def validate_company_id
    Company.find(company) ? return : errors.add(:company,"Invalid Company ID")
end
于 2012-04-12T13:04:47.870 に答える
7

before_create を使用する代わりに。次のように、検証にカスタム メソッドを使用するようにモデルに指示できます。

validate :validate_company_id

def validate_company_id
    cp = Company.find_by_company_id(self.company)
    if cp.nil?
      errors.add(:company, 'Invalid Company ID')
    end
end
于 2012-04-12T04:59:51.273 に答える
-2
Inside you model, you can add custom validations as below:

validate :validate_company_id

def validate_company_id
  Your validations 
  Add error messages can be added as below
  errors.add(:company, "is invalid")
end
于 2012-04-12T05:03:31.837 に答える