gpt4 book ai didi

ruby-on-rails - 多个 Rails 模型中的性别验证

转载 作者:行者123 更新时间:2023-12-01 08:18:27 24 4
gpt4 key购买 nike

大家好——这个问题专门针对 gender验证,但我很想听听你们如何处理具有更大集合的类似情况(例如,国家选择。)

我正在开发一个系统,让运动员可以注册各种赛事,目前正在努力进行良好的性别验证。我的问题是,在许多不同模型上运行相同验证的最佳、最干燥的方法是什么?

假设我要验证 Event 的性别属性和 User .我可以为 validates_each 创建一个助手在更新 gender 之前检查值是否包含在 ["male", "female"] 的非常短的数组中属性。但是,如果我想在 form_for 中访问同一个性别数组怎么办? block ,例如,作为 collection_select 的输入?

我让它适用于一个模型——我声明一个 GENDERS Event 中的常量, 并且有一个简短的类方法

def self.genders
GENDERS
end

通过表格访问。但是,如果多个模型需要访问,我应该将数组存储在哪里?

编辑:一个想法是在应用程序 Controller 中使用类方法。任何关于这种方法有多合适的想法都会很棒。

最佳答案

这是我的解决方案。我喜欢使用标准的插件式库。我会把它放在 lib/acts_as_gendered 中:

module ActsAsGendered
GENDERS = ['male', 'female']

def self.included(base)
base.extend(ActsAsGenderedMethods)
end

module ActsAsGenderedMethods
def acts_as_gendered
extend ClassMethods
include InstanceMethods

validates_inclusion_of :gender, :in => GENDERS
end
end

module ClassMethods
def is_gendered?
true
end
end

module InstanceMethods
def is_male
gender = 'male'
end

def is_female
gender = 'female'
end

def is_male?
gender == 'male'
end

def is_female?
gender == 'female'
end
end
end

是的,这对于简单的性别来说可能有点过头了,但你可以看到所有部分的去向——GENDERS 常数, acts_as_gendered ActiveRecord 钩子(Hook),然后包括类和实例方法以及验证。

然后,在 config/initializers/gender.rb 中:
require 'acts_as_gendered'
ActiveRecord::Base.send(:include, ActsAsGendered)

然后,对于压轴戏,模特:
class User < ActiveRecord::Base
acts_as_gendered
end

这种模式可能看起来过于复杂,但大多数库最终都是这样 :)

更新:为了回答您的评论,这就是我修改acts_as_gendered 方法以在每个模型的基础上使验证成为可选的方式:
def acts_as_gendered options={}
config = {:allow_nil => false}
config.merge(options) if options.is_a?(Hash)

extend ClassMethods
include InstanceMethods

if config[:allow_nil]
validates_inclusion_of :gender, :in => (GENDERS + nil)
else
validates_inclusion_of :gender, :in => GENDERS
end
end

现在您可以像这样在 User 模型中调用它:
class User < ActiveRecord::Base
acts_as_gendered :allow_nil => true
end

我本可以将其设为您传入的简单参数,但我喜欢传入哈希的清晰性。它使您可以在以后添加其他选项。

关于ruby-on-rails - 多个 Rails 模型中的性别验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4383409/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com