26 模型和数据验证之模型验证和回调

在上一章中,我们讲解了如何处理表单验证。在这一章中,我们将深入探讨模型的验证和回调。验证是确保数据的完整性和准确性的重要步骤,而回调则允许我们在对象的生命周期中插入自定义逻辑。让我们一起看看如何在 Rails 中实现这些功能。

模型验证

在 Ruby on Rails 中,模型验证用于确保数据在被保存到数据库之前符合特定的规则。我们可以在模型中定义多个验证规则,包括但不限于:必填验证、唯一性验证、格式验证等。

常见的验证类型

  1. 必填验证(validates :attribute, presence: true
    确保字段不为空。

    1
    2
    3
    4
    class User < ApplicationRecord
    validates :name, presence: true
    validates :email, presence: true
    end
  2. 唯一性验证(validates :attribute, uniqueness: true
    确保字段的值在数据库中是唯一的。

    1
    2
    3
    class User < ApplicationRecord
    validates :email, uniqueness: true
    end
  3. 格式验证(validates :attribute, format: { with: // }
    确保字段值符合特定的正则表达式格式。

    1
    2
    3
    class User < ApplicationRecord
    validates :email, format: { with: URI::MailTo::EMAIL_REGEXP }
    end
  4. 长度验证(validates :attribute, length: { minimum: , maximum:}
    检查字符串的长度。

    1
    2
    3
    class User < ApplicationRecord
    validates :password, length: { minimum: 6 }
    end

自定义验证

你还可以创建自定义验证方法,以实现更复杂的验证逻辑。

1
2
3
4
5
6
7
8
9
10
11
class User < ApplicationRecord
validate :name_cannot_contain_special_characters

private

def name_cannot_contain_special_characters
if name =~ /[^a-zA-Z0-9]/
errors.add(:name, "cannot contain special characters")
end
end
end

模型回调

回调是指在 Active Record 对象的生命周期中的某个时刻自动调用的方法。它们允许我们在特定事件时插入自定义逻辑,比如在创建、更新或删除对象时所执行的操作。

常见的回调类型

  1. before_save
    在保存对象之前执行。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    class User < ApplicationRecord
    before_save :downcase_email

    private

    def downcase_email
    self.email = email.downcase
    end
    end
  2. after_create
    在对象创建后执行。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    class User < ApplicationRecord
    after_create :send_welcome_email

    private

    def send_welcome_email
    UserMailer.welcome_email(self).deliver_now
    end
    end
  3. before_destroy
    在对象删除之前执行。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    class User < ApplicationRecord
    before_destroy :notify_user

    private

    def notify_user
    # 发送通知给用户
    end
    end

回调的使用案例

假设我们有一个博客应用,需要在创建文章时自动设置作者为当前用户,并同时将文章的状态设为“草稿”。我们可以这样实现:

1
2
3
4
5
6
7
8
9
10
class Post < ApplicationRecord
belongs_to :user
before_create :set_default_state

private

def set_default_state
self.state = 'draft'
end
end

小结

在本章中,我们探讨了模型验证和回调的相关知识,学习了如何使用 Rails 提供的验证方法来确保数据的完整性,同时也了解了如何在模型生命周期的不同阶段插入自定义逻辑。下章中,我们将继续深入模型验证,特别是关联模型的验证策略,让我们一起期待更复杂的模型操作。

接下来,我们将讲解关联模型的验证,这将帮助我们理解如何在多个模型间建立有效的数据关系并进行验证。

希望这章内容能够帮助你更好地理解 Rails 的模型验证和回调机制!

26 模型和数据验证之模型验证和回调

https://zglg.work/rails-zero/26/

作者

IT教程网(郭震)

发布于

2024-08-15

更新于

2024-08-16

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论