彼らは正しく答えましたが、別の解決策を提供しました。「私のコードが実行されないのはなぜですか?」と自問することができます。
まず第一に、コードにエラーがあります -@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 に保存されます。何故ですか?
これは、ActiveModel
s のライフサイクルによるものです。メソッドの呼び出しが遅すぎます。
使用できるすべてのコールバック メソッドを次に示します。
作成
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_validation
orコールバックを使用しないでください。before_validation
これで、モデルの有効な検証方法が完成しました。
after_validation :validate_company_id
def validate_company_id
Company.find(company) ? return : errors.add(:company,"Invalid Company ID")
end