我有一个常量的哈希值,我在整个代码中都提到了:
CATEGORIES = {
business: '1002',
education: '1003',
entertainment: '1004',
# etc...
}
在我的一个控制器中,我需要通过参数测试类别的现有,所以通常我会做类似的事情:
CATEGORIES.has_key? params[:category].to_sym
然而,这似乎是对拒绝服务攻击的邀请,因为攻击者可以通过为类别参数提供随机字符串来轻松炸毁Ruby符号表.
似乎最简单的解决方案是将CATEGORY键转换为字符串而不是符号:
CATEGORIES = {
'business' => '1002',
'education' => '1003',
'entertainment' => '1004',
# etc...
}
也许:
def self.valid_category(category_s)
CATEGORIES.keys.any? { |key| key.to_s == category_s }
end
在Rails中有更好或更惯用的方法吗?
最佳答案
Is there a better or more idiomatic way to do this in Rails?
我见过的最常见的方法是你提供的第二种解决方案,即:
def self.valid_category(category_s)
CATEGORIES.keys.any? { |key| key.to_s == category_s }
end
虽然,我会将方法命名为self.valid_category?.也许我也会将类别变量上的.to_s移动到此方法,例如:
def self.valid_category?(category)
category = category.to_s
CATEGORIES.keys.any? { |key| key.to_s == category }
end