比较数字意外的麻烦

时间:2016-03-19 10:47:04

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

我正在编写一个辅助方法,根据两个数字是否相等而向元素添加一个类。我的代码如下:

<% for note in @company.convertible_notes.each %>
    <% if note.id %>
        <li class="tab <%= note_nav(params, note.id) %>"><%= link_to "#{note.security_series} #{note.security_class} Note", convertible_note_convertible_notees_path(note) %></li>
    <% end %>
<% end %>

note_nav调用以下帮助程序:

def note_nav(params, note)
    "active" if params[:controller]=="convertible_notees" && note.to_s==params[:converible_note_id].to_s
end

现在令人惊讶的是,我无法让表达式note.to_s==params[:converible_note_id].to_s注册为true。即使我知道被比较的两个数字都是“1”。我用我的日志检查了它:

logger.debug "are they equal? #{note.to_s==params[:converible_note_id].to_s} note.id is #{note} note params are #{params[:convertible_note_id]}"

产生以下日志条目:

  他们是平等的吗? false note.id是1 note params是1

我猜他们是两种不同的类型,但考虑到我已经转换了它们to_s,我不知道这会是一个什么问题。我已经在其他模型的几个组合上使用了这种完全相同的技术,并且完全没有错误。知道可能会发生什么吗?

提前致谢

2 个答案:

答案 0 :(得分:2)

看看你的测试

"are they equal? #{note.to_s==params[:converible_note_id].to_s} note.id is #{note} note params are #{params[:convertible_note_id].to_s}"

:converible_note_id:convertible_note_id是其他键,类型错误

答案 1 :(得分:0)

如果其中一个变量包含非打印字符,您也可以获得该输出:

note = "1\000"

params = {
  convertible_note_id: 1
}

puts "are they equal? #{note.to_s==params[:convertible_note_id].to_s}"
puts "note.id is #{note} note params are #{params[:convertible_note_id]}"

--output:--
are they equal? false
note.id is 1 note params are 1

要查看字符串中的内容,您应该始终使用inspect():

p note.to_s, params[:convertible_note_id].to_s

--output:--
"1\u0000"
"1"