2016-06-20 10 views
2

私は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> 

答えて

1

私ははSyckを責めるだろう - これは、事前ルビー1.9.3からYAMLパーサーですが(それは私がそれ以降のバージョンではまだ利用可能と考えているだけではデフォルトでしたが)依存する人のための宝石として利用可能にあなたはいくつかの非常に特定のレガシーコードを持っていない限り、それに。すべて

のがらくたMonkeypatches宝石のREADMEから

を「問題」のセクションを引用すると、あなたはほぼ確実にそれを必要としない。その置換(精神)はルビースタンドの一部ですrdライブラリ。

+0

私は前にそれを削除しようとしましたが、新しいパーサがSyckとまったく同じYAMLを処理していなかったためテストに失敗しました。 :/ Psychに既存のYAMLファイルを処理させる方法を理解するために、より多くの作業をしなくてはいけないと思います。 – Trejkaz

関連する問題