我正在做這樣的事情來檢查一個參數是否在一個集合中,並設置一個默認值,如果它不是。它看起來不必要的羅嗦:確保一個值在一個集合中,並設置一個默認值,如果它不是
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
陣列的方法;是這樣的:
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)
三元是一個很好的解決方案。 – superluminary
StackOverflow實現了一個實時語法錯誤檢查:它被稱爲@Mischa =) – mdesantis
說實話,它看起來很複雜。包括!看起來像你想爲數組做任何類型的事情而不是檢查數組中的值。最好使用Hash的獲取方法。 – oivoodoo
你可以把它簡化這樣的:
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。
我也會驗證,但我也想這樣做:發送(:「new _#{@ type}」),並且不想冒着url攻擊的風險。 – superluminary
現在看到我的!怎麼樣? :) –
你可以像這樣的模式:
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
這是非常好的。 – superluminary
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
@ProGNOMmers我改變了我的想法。 :) –
好!我也喜歡'detect'解決方案,這是對Enumerable模塊的一個很好的使用。我可以刪除我的評論:) – mdesantis
@ProGNOMmers非常感謝你:)我總是關心別人的評論。 :) :) –
使用標識哈希和Hash#fetch
。
allowed_types = Hash[ [:poem, :product, :news, :facebook, :tweet].map{|e| [e,e]} ]
@type = allowed_types.fetch(@type, :poem)
你有興趣創建新的抽象嗎?這是我使用的一個:'@type = params [:type] .whitelist(allowed_types)|| :poem'。 – tokland
@tokland現在看到我的!怎麼樣? :) –
這屬於http://codereview.stackexchange.com –