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
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 に答える
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と仮定します。

于 2013-04-16T12:34:33.973 に答える
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 に答える
1

ID ハッシュと を使用し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 に答える