パラメータがセットに含まれているかどうかを確認し、そうでない場合はデフォルト値を設定するために、このようなことをしています。不必要に冗長に見えます:
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)
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
次のように単純化できます。
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
と仮定します。
モデルで次のようなものを作成できます。
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
ID ハッシュと を使用しHash#fetch
ます。
allowed_types = Hash[ [:poem, :product, :news, :facebook, :tweet].map{|e| [e,e]} ]
@type = allowed_types.fetch(@type, :poem)