我正在做这样的事情来检查参数是否在集合中,如果不是,则设置默认值。它看起来不必要地罗嗦:
allowed_types = [:poem, :product, :news, :facebook, :tweet]
@type = params[:type]
@type = :poem unless allowed_types.include?(@type)
完成此任务的最 Ruby 方式是什么?
我正在做这样的事情来检查参数是否在集合中,如果不是,则设置默认值。它看起来不必要地罗嗦:
allowed_types = [:poem, :product, :news, :facebook, :tweet]
@type = params[:type]
@type = :poem unless allowed_types.include?(@type)
完成此任务的最 Ruby 方式是什么?
那这个呢:
allowed_types = [:poem, :product, :news, :facebook, :tweet]
@type = allowed_types.include?(params[:type]) ? params[:type] : :poem
看到我们在这里,我会说恕我直言,类似于Hash#fetch
;的 Array 方法会很有用。就像是:
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)
你可以像这样简化它:
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
我假设您在 rails 或 synatra 中。
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
使用身份哈希和Hash#fetch
.
allowed_types = Hash[ [:poem, :product, :news, :facebook, :tweet].map{|e| [e,e]} ]
@type = allowed_types.fetch(@type, :poem)
你可以在模型中做这样的事情:
class ModelName < ActiveRecord::Base
ALLOWED_TYPES = Hash[[:poem, :product, :news, :facebook, :tweet].map{|v| [v,v]}] # { :poem => :poem ...
end
在控制器中,您可以对 ALLOWED_TYPES 使用 fetch 方法:
ModelName::ALLOWED_TYPES.fetch(params[:type], :poem) # it will set as default poem