我是Ruby on Rails的新手 我有一个场景,我有一个有一些字段的表单。我需要对具有数据的表进行验证的字段值之一。 我想限制用户保存任何数据,除非使用表记录验证该字段。
最初我在控制器中添加了代码来验证,但我还有其他字段需要验证为空,所以它不起作用。
此外,我希望验证错误成为其他错误的一部分。
我在模型文件中尝试了以下代码
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
答案 0 :(得分:15)
这些家伙回答正确,但为解决方案提供了另一种方式。你可以问自己:“为什么我的代码没有被执行?”
首先,您的代码中存在错误 - @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保存模型,它仍会传递并保存到数据库中。那是为什么?
这是因为ActiveModel
的生命周期。你的方法被调用得太晚了。
以下是您可以使用的所有回调方法
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
答案 1 :(得分: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
答案 2 :(得分:-1)
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