【问题标题】:why if condition is not working为什么如果条件不起作用
【发布时间】:2017-03-27 20:23:29
【问题描述】:

我正在测试下面的小代码

  params[:code] = if false
                                 'N'
                               else
                                 'Y'
                               end

如果 param[:code] 作为 true 或 false 传递,它返回 N 并且 rubucop 显示错误文字“false”出现在条件中。知道为什么吗?

【问题讨论】:

标签: ruby ruby-on-rails-4 literals rubocop


【解决方案1】:

如果为假

params[:code] = if false
                   'N'
                else
                   'Y'
                end

这段代码只是:

params[:code] = 'Y'

没有if,没有但是:false 很好,总是false,所以无法联系到N。这就是 rubocop 抱怨的原因。

修改后的代码

我猜你是想写:

params[:code] = if params[:code] == false
                   'N'
                else
                   'Y'
                end

它根本不是红宝石,但至少它看起来像您的代码并且可以按照您的期望进行。

测试它:

params = {code: false}

params[:code] = if params[:code] == false
                   'N'
                else
                   'Y'
                end
p params
# {:code=>"N"}

警告!

如果您的 params 值是字符串(通常是这样),您必须针对字符串进行测试:

 params[:code] = if params[:code] == "false"
                       'N'
                    else
                       'Y'
                    end

使用三元:

params[:code] = params[:code] == "false" ? 'N' : 'Y'

或者一个哈希:

params[:code] = {'true' => 'Y', 'false' => 'N'}[params[:code]]

如果您有模糊输入(例如true"true""True""yes"),您可以使用Rails built-in methods to convert to boolean

code = ActiveRecord::Type::Boolean.new.type_cast_from_database(params[:code]) # For Rails 4.2
params[:code] = code ? 'Y' : 'N'

【讨论】:

  • 谢谢。我正在尝试您修改后的代码,但是对于输入值 false,它的分配参数 [:code] = Y。还有其他方法吗?我正在使用邮递员进行测试localhost:3001/D/DB_ID/users/user_id/test?code=false
  • @User7354632781:您的本地主机不是我的本地主机,我无法访问您的服务器。另外,您的输入值是"false"(字符串)还是false(布尔值)?
  • true 或 false 是布尔值
  • 它们可能是字符串。 param 值几乎总是字符串,除非您提交 JSON。
  • 您是否考虑过将if params[:code] == false 更改为if !params[:code],或者更好的是,unless params[:code]'? Explicit comparison to false` 不是惯用的 Ruby。你可能知道这一点,但我敢打赌 OP 不知道。
【解决方案2】:

你试过了吗……

params[:code] ? 'Y' : 'N'

或者

params[:code] = params[:code] ? 'Y' : 'N'
# If you are trying to also re-assign params[:code].

【讨论】:

  • 我不相信阅读这个问题会让任何事情变得显而易见。
  • 我将代码值作为 true 和 false 传递,并基于该更新参数代码值到 Y 或 N。
  • 那么我提供的第二个例子就是要走的路。
猜你喜欢
  • 2012-08-23
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
  • 2018-07-21
  • 2021-04-27
  • 1970-01-01
相关资源
最近更新 更多