【问题标题】:How to include a 'next if' condition in an inline loop如何在内联循环中包含“下一个 if”条件
【发布时间】:2016-11-18 12:52:40
【问题描述】:

我想在这个循环中包含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] }

【问题讨论】:

    标签: ruby-on-rails ruby forms ruby-on-rails-5 slim-lang


    【解决方案1】:

    拥有一个列表,您可以随时根据条件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] }
    

    【讨论】:

    • 你这么快? :)
    • @SergioTulentsev 昨天我对你有同样的问题!意思是,你在问题出现几秒钟后就回答了一些问题,我就像“哇?” :D
    • @AndreyDeineko:哈哈,看看this one
    • @SergioTulentsev ...
    【解决方案2】:

    您几乎是正确的: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" }
    

    【讨论】:

    • 这个问题是跳过的迭代会在映射结果中产生nil
    • 是的,没有语法错误的 OP 代码也是如此。我假设这就是意图。
    • 我打赌这不是本意,这个问题是 XY 问题的典型例子。
    • 你可以在最后拨打compact
    猜你喜欢
    • 2017-10-22
    • 2017-01-11
    • 2011-12-07
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-01
    相关资源
    最近更新 更多