Ruby on rails 如何在保存到RubyonRails之前验证表中的记录
我是RubyonRails新手 我有一个场景,其中我有一个表单,它有一些字段。我需要根据包含数据的表验证的字段值之一。 我想限制用户保存任何数据,除非使用表记录验证该字段 最初,我在controller中添加了代码来验证它,但我还有其他字段需要验证为空,所以它不起作用 我还希望验证错误是其他错误的一部分 我在模型文件中尝试了以下代码Ruby on rails 如何在保存到RubyonRails之前验证表中的记录,ruby-on-rails,model,actioncontroller,Ruby On Rails,Model,Actioncontroller,我是RubyonRails新手 我有一个场景,其中我有一个表单,它有一些字段。我需要根据包含数据的表验证的字段值之一。 我想限制用户保存任何数据,除非使用表记录验证该字段 最初,我在controller中添加了代码来验证它,但我还有其他字段需要验证为空,所以它不起作用 我还希望验证错误是其他错误的一部分 我在模型文件中尝试了以下代码 before_create :validate_company_id def validate_company_id cp = Company.find_
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而不是在创建之前使用。您可以告诉模型使用自定义方法进行验证,如下所示
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
这些人回答正确,但提供了另一种解决方法。你可以问自己:“为什么我的代码没有被执行?” 首先,您的代码中有错误-
@cp
未定义。另外,我不知道你想通过self.status | |=无效“
实现什么
调用属性时也不必使用self
,但在分配新属性值时必须调用它。因此,self.company
是不必要的,您可以使用company
我还注意到您的公司
表中有公司id
属性。这不是必须的,通常的惯例是只使用一个id。如果不想更改表格,可以在模型上设置id
字段,如下所示:
class Company < ActiveRecord::Base
set_primary_key :company_id
# ... the rest of your model code ...
end
首先,我想在这里使用三元运算符
before_create :validate_company_id
def validate_company_id
Company.find(company) ? return : self.status ||= "Invalid"
end
这不是更干净吗?它做完全相同的事情
现在谈谈你的self.status
。如果要使ActiveModel
中的对象无效,必须在errors
hash中设置一些值。如果您认为status属性为“Invalid”的模型是无效的,那么您就误解了。它仍然是Rails中非常有效的模型
那么,如何使之无效呢
您将一些值放入errors
hash中。您还可以指定消息和验证错误所引用的属性
让我们在你的模型上做吧
before_create :validate_company_id
def validate_company_id
Company.find(company) ? return : errors.add(:company,"Invalid Company ID")
end
现在,如果您试图用无效的公司id保存模型,它仍然会通过并保存到数据库。为什么呢
这是因为ActiveModel
s的生命周期。调用您的方法太晚了
以下是您可以使用的所有回调方法
创建
更新
毁灭
请注意在验证周期结束后很长时间内如何调用方法。因此,您不应该在创建之前使用,而应该在验证之后使用,或者在验证之前使用
这里我们介绍了模型的有效性验证方法
after_validation :validate_company_id
def validate_company_id
Company.find(company) ? return : errors.add(:company,"Invalid Company ID")
end
before_create :validate_company_id
def validate_company_id
Company.find(company) ? return : errors.add(:company,"Invalid Company ID")
end
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
after_validation :validate_company_id
def validate_company_id
Company.find(company) ? return : errors.add(:company,"Invalid Company ID")
end