Ruby on rails 如何在保存到RubyonRails之前验证表中的记录

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_

我是RubyonRails新手 我有一个场景,其中我有一个表单,它有一些字段。我需要根据包含数据的表验证的字段值之一。 我想限制用户保存任何数据,除非使用表记录验证该字段

最初,我在controller中添加了代码来验证它,但我还有其他字段需要验证为空,所以它不起作用

我还希望验证错误是其他错误的一部分

我在模型文件中尝试了以下代码

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