这些家伙回答正确,但提供了另一种解决方案。你可以问自己:“为什么我的代码没有被执行?”
首先,您的代码中有错误 -@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
哈希中设置一些值。如果您认为状态属性为“Invalid”的模型无效,那您就误会了。它在 Rails 中仍然是完全有效的模型。
那么如何作废呢?
您将一些值放errors
入哈希中。您还可以指定一条消息和验证错误所指的属性。
所以让我们在你的模型上做
before_create :validate_company_id
def validate_company_id
Company.find(company) ? return : errors.add(:company,"Invalid Company ID")
end
现在,如果您尝试使用无效的 company_id 保存模型,它仍然会通过并保存到数据库中。这是为什么?
这是因为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
, 而是after_validation
使用before_validation
回调。
在这里,我们使用您的模型的工作验证方法。
after_validation :validate_company_id
def validate_company_id
Company.find(company) ? return : errors.add(:company,"Invalid Company ID")
end