Sam*_*hie 3 ruby-on-rails data-modeling
嘿所有 - 这个问题具体是关于gender验证,但我有兴趣听听你们是如何处理类似情况的更大的集合(例如国家选择).
我正在开发一个系统,让运动员注册各种活动,目前正在进行良好的性别验证.我的问题是,在许多不同模型上运行相同验证的最佳,最干燥的方法是什么?
比方说,我想验证的性别属性Event和User.validates_each在更新gender属性之前,我可以为该检查值创建一个帮助程序,以包含在["male","female"]的非常短的数组中.但是,如果我想在一个form_for块中访问这个相同的性别数组,比如作为输入collection_select?
我有一个模型工作 - 我声明一个GENDERS常量Event,并有一个短类方法
def self.genders
GENDERS
end
Run Code Online (Sandbox Code Playgroud)
用于表格访问.但是,如果多个模型需要访问,我应该在哪里存储数组?
编辑:一个想法是在应用程序控制器中使用类方法.关于这种方法的合适程度的任何想法都会很棒.
这是我的解决方案.我喜欢使用标准的插件式库.我把它放在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
Run Code Online (Sandbox Code Playgroud)
是的,对于简单的性别来说可能有些过分,但是你可以看到所有部分的位置--GENDERS常量,acts_as_genderedActiveRecord钩子,然后包括类和实例方法以及验证.
然后,在config/initializers/gender.rb中:
require 'acts_as_gendered'
ActiveRecord::Base.send(:include, ActsAsGendered)
Run Code Online (Sandbox Code Playgroud)
然后,对于大结局,模型:
class User < ActiveRecord::Base
acts_as_gendered
end
Run Code Online (Sandbox Code Playgroud)
这种模式可能看起来过于复杂,但这就是大多数库最终最终的结果:)
更新:要回答您的评论,我将修改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
Run Code Online (Sandbox Code Playgroud)
现在您可以在User模型中调用它,如下所示:
class User < ActiveRecord::Base
acts_as_gendered :allow_nil => true
end
Run Code Online (Sandbox Code Playgroud)
我可以把它作为你传入的一个简单参数,但我喜欢传递散列的清晰度.它会让您在未来添加其他选项.
| 归档时间: |
|
| 查看次数: |
2301 次 |
| 最近记录: |