为什么如果条件不起作用

时间:2017-03-27 20:23:30

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

我正在测试

下面的小代码
  params[:code] = if false
                                 'N'
                               else
                                 'Y'
                               end

如果param [:code]传递为true或false,则返回N,而rubucop显示错误文字' false'出现在一个条件。知道为什么吗?

2 个答案:

答案 0 :(得分:2)

如果为false

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

它根本不是rubyish,但至少它看起来像你的代码,并按照你的期望做到。

测试它:

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'

答案 1 :(得分:1)

你试过这个......

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

或者

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