确保值在集合中,如果不是,则设置默认值

时间:2013-04-16 12:29:34

标签: ruby

我正在做这样的事情来检查一个参数是否在一个集合中,并设置一个默认值,如果不是。它看起来不必要地罗嗦:

allowed_types = [:poem, :product, :news, :facebook, :tweet]
@type = params[:type]
@type = :poem unless allowed_types.include?(@type)

实现这一目标的Ruby方法是什么?

5 个答案:

答案 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)