4

我是 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

但它没有验证,你能帮我如何验证它。

问候苏尔扬

4

3 回答 3

18

这些家伙回答正确,但提供了另一种解决方案。你可以问自己:“为什么我的代码没有被执行?”

首先,您的代码中有错误 -@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 保存模型,它仍然会通过并保存到数据库中。这是为什么?

这是因为ActiveModels 生命周期。你的方法被调用得太晚了。

这是您可以使用的所有回调方法

创造

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
于 2012-04-12T13:04:47.870 回答
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
于 2012-04-12T04:59:51.273 回答
-2
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
于 2012-04-12T05:03:31.837 回答