我正在做这样的事情来检查一个参数是否在一个集合中,并设置一个默认值,如果不是。它看起来不必要地罗嗦:
allowed_types = [:poem, :product, :news, :facebook, :tweet]
@type = params[:type]
@type = :poem unless allowed_types.include?(@type)
实现这一目标的Ruby方法是什么?
答案 0 :(得分:5)
这个怎么样:
allowed_types = [:poem, :product, :news, :facebook, :tweet]
@type = allowed_types.include?(params[:type]) ? params[:type] : :poem
看到我们在这里,我会说恕我直言,这将是一个有用的类似于Hash#fetch
的数组方法;类似的东西:
class Array
# `fetch` is already taken (index fetching)
def fetch_value(something, ifnone = nil)
include?(something) ? something : ifnone
end
end
[:poem, :product, :news].fetch_value(:news, :poem) #=> :news
[:poem, :product, :news].fetch_value(:salad, :poem) #=> :poem
所以有人可以这样做:
@type = allowed_types.fetch_value(params[:type], :poem)
答案 1 :(得分:2)
您可以像这样简化:
allowed_types = [:poem, :product, :news, :facebook, :tweet]
@type = allowed_types.include?(params[:type]) ? params[:type] : :poem
但你真正应该做的是验证,尽量保持所有的逻辑。也许是这样的事情:
validates :type, inclusion: { in: %w(poem product news facebook tweet) }
对于params
我假设你是在轨道或者是synatra。
答案 2 :(得分:2)
a = [1,2,4,5]
var = a.detect(proc{"not present"}){ |x| x == 55 }
p var #=> "not present"
a = [1,2,4,5]
var = a.detect(proc{"not present"}){ |x| x == 4 }
p var #=> 4
a = [1,2,4,5]
var = a.detect(proc{"not present"}){ |x| x == 1 }
p var #=> 1
答案 3 :(得分:1)
您可以在模型中制作类似的内容:
class ModelName < ActiveRecord::Base
ALLOWED_TYPES = Hash[[:poem, :product, :news, :facebook, :tweet].map{|v| [v,v]}] # { :poem => :poem ...
end
在控制器中,您可以使用ALLOWED_TYPES的获取方法:
ModelName::ALLOWED_TYPES.fetch(params[:type], :poem) # it will set as default poem
答案 4 :(得分:1)
使用身份哈希和Hash#fetch
。
allowed_types = Hash[ [:poem, :product, :news, :facebook, :tweet].map{|e| [e,e]} ]
@type = allowed_types.fetch(@type, :poem)