【发布时间】:2011-11-14 10:18:22
【问题描述】:
我有一个类用于包含属性类型的选择菜单选项。它工作正常。但是,我需要能够验证选择并根据所选选项执行特定逻辑。这需要在我的 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
【问题讨论】:
标签: ruby-on-rails selection verification