【问题标题】:Ruby strings that appear the same are not equal, why?看起来相同的 Ruby 字符串不相等,为什么?
【发布时间】:2017-07-31 21:58:00
【问题描述】:

我正在导入 CSV 并使用 ActiveRecord 创建行。 CSV 是:

first_name,middle_name,last_name,degrees,email,induction_year (ie 2017),"induction_type (options: alumni, associate, faculty, honorary, student)"
John,Middle,Doe,"BA, MPH",test@test.com,2017,alumni

我的导入方法如下所示:

def import
  CSV.foreach(@file.path, headers: true, header_converters: lambda {|field| field.partition(" ").first }, col_sep: ',') do |row|
    member_params = row.to_hash
    Member.create!(member_params)
  end
end

但它会抛出ActiveModel::UnknownAttributeError: unknown attribute 'first_name' for Member. 编辑:这不是会员的问题 我可以像您期望的那样创建会员 Member.create!(first_name: 'test')

打开一个pry,我得到了这个反馈:

[1] pry(#<InducteesUpload>)> member_params
=> {"first_name"=>"John",
"middle_name"=>"Middle",
"last_name"=>"Doe",
"degrees"=>"BA, MPH",
"email"=>"test@test.com",
"induction_year"=>"2017",
"induction_type"=>"alumni"}
[2] pry(#<InducteesUpload>)> member_params.keys.first == "first_name"
 => false
[3] pry(#<InducteesUpload>)> member_params.keys.first.encoding
=> #<Encoding:UTF-8>

添加更多:

[1] pry(#<InducteesUpload>)> member_params.keys
=> ["first_name",
  "middle_name",
  "last_name",
  "degrees",
  "email",
  "induction_year",
  "induction_type"]

[2] pry(#<InducteesUpload>)> member_params["first_name"] = "test"
=> "test"
[3] pry(#<InducteesUpload>)> member_params
=> {"first_name"=>"John",
 "middle_name"=>"Middle",
 "last_name"=>"Doe",
 "degrees"=>"BA, MPH",
 "email"=>"test@test.com",
 "induction_year"=>"2017",
 "induction_type"=>"alumni",
 "first_name"=>"test"}

正如您在上面的怪异中看到的那样,Member 不是问题。但如果你真的想要,会发​​布。

所以问题就暴露在这里了:

[6] pry(#<InducteesUpload>)> member_params.keys.first.bytes
=> [239, 187, 191, 102, 105, 114, 115, 116, 95, 110, 97, 109, 101]
[7] pry(#<InducteesUpload>)> "first_name".bytes
=> [102, 105, 114, 115, 116, 95, 110, 97, 109, 101]

【问题讨论】:

  • 你能把Member的代码贴出来吗?
  • 听起来问题出在成员身上...如果您尝试保存到数据库,通常需要从 ActiveRecord::Base 继承。
  • member_params.keys 的结果是什么?
  • 也许你的“first_name”键中有一些不可见的字符...
  • 我赌的是 unicode 魔法。比较member_params.keys.first.bytes"first_name".bytes

标签: ruby-on-rails ruby


【解决方案1】:

我相信您在作为哈希键的字符串和符号之间存在冲突。尝试Member.create!(member_params.with_indifferent_access) 提到的here

【讨论】:

  • 试一试,但没有成功。正如你在上面看到的,键都是字符串。
【解决方案2】:

我赌的是 unicode 魔法。比较 member_params.keys.first.bytes"first_name".bytes。您可能会发现不同之处。

Unicode 中有很多符号看起来很像,但又不相等。

【讨论】:

  • 说到符号:codepoints 在处理多字节字符串时通常比bytes 更有意义。
  • @Stefan:通常是的,但我认为在这种情况下bytes 也可以。或者甚至更好! (BOM 不是有效的代码点,是吗?)
猜你喜欢
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多