2

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

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

完成此任务的最 Ruby 方式是什么?

4

5 回答 5

5

那这个呢:

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)
于 2013-04-16T12:33:54.893 回答
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我假设您在 rails 或 synatra 中。

于 2013-04-16T12:34:33.973 回答
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
于 2013-04-16T12:45:28.650 回答
1

使用身份哈希和Hash#fetch.

allowed_types = Hash[ [:poem, :product, :news, :facebook, :tweet].map{|e| [e,e]} ]
@type = allowed_types.fetch(@type, :poem)
于 2013-04-16T19:42:22.653 回答
1

你可以在模型中做这样的事情:

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
于 2013-04-16T12:40:54.750 回答