2016-11-18 35 views
1

我想包括next if在這個循環:如何包括一個內嵌循環中的「未來如果」條件

= select_tag :type, options_for_select(Products.statuses.keys.map{ |product_type| [I18n.t("product.#{product_type}"), product_type] }, params[:type]) 

所以我想的東西如:

Products.statuses.keys.map{ |product_type| next if product_type == "clothes", [I18n.t("product.#{product_type}"), product_type] } 

回答

2

有一個列表您可以隨時selectreject元素基於條件:

Products.statuses 
     .keys 
     .reject { |product_type| product_type == "clothes" } # <= won't be in list 
     .map { |product_type| [I18n.t("product.#{product_type}"), product_type] } 
+3

宇如此快速? :) –

+2

快速和正確的! ;)非常感謝你 – Orsay

+2

@SergioTulentsev昨天我對你有同樣的問題!意思是說,在問題出現後幾秒鐘,你就回答了一些問題,我就像是「好嗎?」 :D –

1

你擁有了它幾乎正確的:在Ruby中表達分隔符是分號;,而不是一個逗號,,所以它應該是

Products.statuses.keys.map{ |product_type| next if product_type == "clothes"; [I18n.t("product.#{product_type}"), product_type] } 
#                   ↑↑↑ 

你也可以顛倒邏輯,並把它寫這樣的:

Products.statuses.keys.map{ |product_type| next [I18n.t("product.#{product_type}"), product_type] unless product_type == "clothes" } 
+0

這個問題是跳過的迭代會在映射結果中產生'nil'。 –

+0

是的,OP的代碼沒有語法錯誤。我認爲這是意圖。 –

+0

我敢打賭,這不是意圖,問題是XY問題的典型例子。 –