我有一个类用于包含属性类型的选择菜单选项。它工作正常。但是,我需要能够根据所选选项验证选择并执行特定逻辑。这需要在我的Ruby代码和JavaScript中发生。
以下是有问题的课程:
class PropertyTypes
def self.[](id)
@@types[id]
end
def self.options_for_select
@@for_select
end
private
@@types = {
1 => "Residential",
2 => "Commercial",
3 => "Land",
4 => "Multi-Family",
5 => "Retail",
6 => "Shopping Center",
7 => "Industrial",
8 => "Self Storage",
9 => "Office",
10 => "Hospitality"
}
@@for_select = @@types.each_pair.map{|id, display_name| [display_name, id]}
end
验证选择的最佳方法是什么?我需要根据每种类型的属性类型执行特定的逻辑并显示用户界面元素。
由于我存储了id,我将验证id是否是特定的属性类型。类似的东西:
PropertyTypes.isResidential?(id)
然后这个方法看起来像这样:
def self.isResidential?(id)
@@types[id] == "Residential"
end
但现在我正在重复字符串“Residential”。
对于JavaScript,我假设我会将ajax调用回模型以保持验证码DRY,但这似乎过度杀人。
我是否需要为每种属性类型手动创建验证方法,还是可以使用define_method?
这看起来很基本,但我对此问题感到困惑和沮丧。
由于
=== 这是我的解决方案:
class << self
@@types.values.each do |v|
# need to remove any spaces or hashes from the found property type
v = v.downcase().gsub(/\W+/, '')
define_method "is_#{v}?", do |i|
type_name = @@types[i]
return false if type_name == nil #in case a bogus index is passed in
type_name = type_name.downcase().gsub(/\W+/, '')
type_name == v
end
end
end
答案 0 :(得分:1)
听起来你可以从一些Ruby元编程中受益。尝试谷歌搜索“ruby method_missing”。你可以快速做一些事情。肮脏的:
class PropertyTypes
def method_missing(meth, *args, &block)
if meth.to_s =~ /^is_(.+)\?$/
@@types[args.first] == $1
else
super
end
end
end
答案 1 :(得分:0)
在红宝石方面,您也可以使用类似的东西来动态定义这些方法:
class << self
@@types.values.each do |v|
define_method "is_#{v}?", do |i|
@@types[i] == v
end
end
end