私はRuby 2.3.1に更新しようとしたところで奇妙なことが起こっていますが、今はテストが失敗します。失敗したテストは、実際の失敗ではなく、壊れたデータがRailsのフィクスチャにあるようです。固定具にRailsがエスケープされた文字列をフィクスチャで正しくエスケープしないのはなぜですか?
、私が持っている:私は、コンソールでこの値を見てみると、二重にエスケープされているよう
one:
name: "\u30C6\u30B9\u30C8"
、それはそうです:
irb(main):001:0> Organisation.first.name
Organisation Load (0.1ms) SELECT "organisations".* FROM "organisations" ORDER BY "organisations"."id" ASC LIMIT 1
=> "\\u30C6\\u30B9\\u30C8"
これもまさにですテスト自体をデバッグしたときに私は見ました。
これまでに知られている:
- 私は戻ってRubyの2.1.2へのダウングレードした場合、私は適切なエスケープ値を参照してください。
- 私がRuby 2.2.2にダウングレードすると、引き続き問題が発生します。
- と同じファイルを
YAML.load
を使用してロードすると、適切なエスケープされていない値が表示されます。 - 新品のRailsアプリケーションを作成し、まったく同じフィクスチャの行をコピーすると、エスケープされていない適切な値が表示されます。
何が起こっている可能性がありますか?他のいくつかの宝石がYAMLの解析に干渉しているのですが、Railsが灯体をロードするために使用しているものを使用してロードされたときだけですか? YAML.load
は正常に動作しているように見えますが、Railsはどのように動作しないのですか?
Railsはバージョン4.2.6です。使用中の
その他の宝石:
gem 'rails', '~> 4.2.0'
gem 'sqlite3'
gem 'mysql2', platforms: %w(ruby)
group :development do
gem 'capistrano', git: 'git://github.com/trejkaz/capistrano'
gem 'capistrano-rails'
gem 'capistrano-rbenv'
end
gem 'uglifier'
gem 'execjs'
gem 'therubyracer'
group :development, :test do
gem 'byebug'
end
gem 'rails3-restful-authentication', require: 'restful_authentication'
gem 'strip_attributes'
gem 'dynamic_form'
gem 'will_paginate'
gem 'acts_as_list'
gem 'jquery-tokeninput-rails'
gem 'jquery-rails'
gem 'jquery-ui-rails'
gem 'exception_notification', '~> 4.0.0'
gem 'syck', '~> 1.0.0'
group :development, :test do
gem 'simplecov'
gem 'ci_reporter_minitest'
gem 'mocha'
gem 'metric_fu'
gem 'flog', '~> 4.3.2'
end
はActiveRecordの内側に掘る、コードを読んで、低レベルのフィクスチャは間違いなく何らかの形で間違ったことをやっている...ロードYAMLの
irb(main):014:0> ActiveRecord::FixtureSet::File.open('test/fixtures/organisations.yml') { |fh| fh.each { |fixture_name, row| puts fixture_name; puts row } }
one
{"name"=>"\\u30C6\\u30B9\\u30C8"}
=> [["one", {"name"=>"\\u30C6\\u30B9\\u30C8"}]]
動作が異なりあなたがirbをロードするのか、それともレールコンソールを使うのかなど、環境にある何かがYAMLを何とか読んでいないように思えます。 :(
$ irb
irb(main):001:0> require 'yaml'
=> true
irb(main):002:0> YAML.load_file('test/fixtures/organisations.yml')
=> {"six"=>{"name"=>"テスト"}}
irb(main):003:0>
$ bundle exec rails console
Loading development environment (Rails 4.2.6)
irb(main):001:0> YAML.load_file('test/fixtures/organisations.yml')
=> {"six"=>{"name"=>"\\u30C6\\u30B9\\u30C8"}}
irb(main):002:0>
私は前にそれを削除しようとしましたが、新しいパーサがSyckとまったく同じYAMLを処理していなかったためテストに失敗しました。 :/ Psychに既存のYAMLファイルを処理させる方法を理解するために、より多くの作業をしなくてはいけないと思います。 – Trejkaz