2016-06-20 14 views
2

Ich habe eine komische Sache dort, wo ich versucht habe, auf Ruby 2.3.1 zu aktualisieren, aber jetzt schlägt ein Test fehl. Der Test, der fehlschlägt, scheint so zu sein, als ob die Daten in den Rails-Scheinwerfern defekt wären, im Gegensatz zu einem echten Fehler.Warum ignoriert Rails die Strings in meinen Fixtures nicht korrekt?

In der Vorrichtung, die ich habe:

one: 
    name: "\u30C6\u30B9\u30C8" 

Als ich auf diesem Wert in der Konsole sehen, scheint es, wie es doppelt entgangen war:

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" 

Dies auch genau das, was Ich habe gesehen, als ich die Tests selbst getestet habe.

bisher bekannt:

  • Wenn ich Ruby Herabstufung zurück 2.1.2, sehe ich den richtigen unescaped Wert.
  • Wenn ich auf Ruby 2.2.2 herabstufen, tritt das Problem weiterhin auf.
  • Wenn ich die exakt die gleiche Datei mit YAML.load auf Ruby 2.3.1 laden, sehe ich den richtigen Wert unescaped.
  • Wenn ich eine brandneue Rails-Anwendung erstellen und die genau gleichen Fixture-Linien über kopieren, sehe ich den richtigen Wert nicht entkoppelt.

Was könnte hier möglicherweise passieren? Behindert ein anderes Juwel die Analyse von YAML, aber nur wenn es mit den von Rails zum Laden von Fixtures geladenen Daten geladen wird? Wie lädt Rails Fixtures, die es nicht funktioniert, obwohl YAML.load scheint gut zu funktionieren?

Schienen ist Version 4.2.6.

Andere Edelsteine ​​im Einsatz:

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 

innerhalb Active Graben, der Lesecode Leuchte Low-Level ist irgendwie die falsche Sache auf jeden Fall tun ...

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"}]] 

Verhalten der Lade YAML unterscheidet je ob du nur irb lädst, oder benutze die rails-konsole ... Es scheint also so, als ob etwas anderes in der Umgebung es versäumt, YAML irgendwie zu lesen. :(

$ 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> 

Antwort

1

ich syck Schuld würde - das ist der yaml Parser von pre Rubin 1.9.3 (obwohl es wurde ich in späteren Versionen noch verfügbar glaube einfach nicht die Standardeinstellung) als ein Juwel für diejenigen zur Verfügung gestellt, die abhängig auf sie. readme zu zitieren

die „Probleme“ Abschnitt aus dem Juwel des

Monkeypatches die Scheiße aus alles

es sei denn, Sie einige ganz besondere Legacy-Code haben Sie fast sicher es nicht brauchen. Seine Ersatz (psych) ist Teil des Rubinstandes Bibliothek.

+0

Ich hatte versucht, es vorher zu entfernen, aber Tests fehlgeschlagen, weil der neue Parser meine YAML nicht genau wie Syck behandelt. :/Ich schätze, ich muss mehr arbeiten, um herauszufinden, wie Psych mit unseren bestehenden YAML-Dateien umgehen kann. – Trejkaz

Verwandte Themen