2

Rails 3.2.8 アプリがあります。Ruby 1.9.3 と JRuby 1.6.7.2 の両方で 1.9 互換モードで動作します。データベースに挿入すると、JRuby でクラッシュすることがあります。

これが私のen.ymlファイルです:

en:
  moo: "you’re"
  meep: "you"
  bar: "\"Booón\""
  baz: "Booón"

送信者と件名の 2 つの属性を持つ Message オブジェクトがあるとします。以下は、送信者と件名のいくつかの可能な組み合わせです。

msg = Message.new(subject: "sblah", sender: I18n.t("bar"))
msg.save

msg = Message.new(subject: "sblah", sender: I18n.t("baz"))
msg.save

msg = Message.new(subject: I18n.t("moo"), sender: I18n.t("baz"))
msg.save

msg = Message.new(subject: I18n.t("moo"), sender: "temp")
msg.save

msg = Message.new(subject: I18n.t("meep"), sender: I18n.t("bar"))
msg.save

# Mystery crash
msg = Message.new(subject: I18n.t("moo"), sender: I18n.t("bar"))
msg.save

JRuby 1.6.7.2 (1.9 との互換性あり) で実行すると、最後のものでクラッシュが発生します。クラッシュは、MRI 1.9.3p194では発生しません。

クラッシュをトリガーするには、(アクセント付きの文字と引用符) と (カーリー アポストロフィ) の組み合わせが必要なようです。それらのいずれかを取り除いてください。クラッシュはありません。

Encoding::CompatibilityError: incompatible character encodings: ASCII-8BIT and UTF-8
    from org/jruby/RubyString.java:2926:in `gsub'
    from /Users/paul/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/activerecord-jdbc-adapter-1.2.2/lib/arjdbc/mysql/adapter.rb:485:in `exec_insert'
    from /Users/paul/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/activerecord-3.2.8/lib/active_record/connection_adapters/abstract/database_statements.rb:90:in `insert'
    from /Users/paul/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/activerecord-3.2.8/lib/active_record/connection_adapters/abstract/query_cache.rb:19:in `insert'
    from /Users/paul/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/activerecord-3.2.8/lib/active_record/relation.rb:66:in `insert'
    from /Users/paul/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/activerecord-3.2.8/lib/active_record/persistence.rb:366:in `create'
    from /Users/paul/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/activerecord-3.2.8/lib/active_record/timestamp.rb:57:in `create'
    from /Users/paul/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/activerecord-3.2.8/lib/active_record/callbacks.rb:268:in `create'
    from /Users/paul/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/activesupport-3.2.8/lib/active_support/callbacks.rb:406:in `_run__142677804__create__486269792__callbacks'
    from org/jruby/RubyBasicObject.java:1698:in `__send__'
    from org/jruby/RubyKernel.java:2097:in `send'
    from /Users/paul/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/activesupport-3.2.8/lib/active_support/callbacks.rb:405:in `__run_callback'
    from /Users/paul/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/activesupport-3.2.8/lib/active_support/callbacks.rb:390:in `_run_create_callbacks'
    from org/jruby/RubyBasicObject.java:1698:in `__send__'
    from org/jruby/RubyKernel.java:2097:in `send'
    from /Users/paul/.rbenv/versions/jruby-1.6.7.2/lib/ruby/gems/1.8/gems/activesupport-3.2.8/lib/active_support/callbacks.rb:81:in `run_callbacks'
... 17 levels...

クラッシュしたコードは次のとおりです。

480       def exec_insert(sql, name, binds)
481         binds = binds.dup
482 
483         # Pretend to support bind parameters
484         unless binds.empty?
485           sql = sql.gsub('?') { quote(*binds.shift.reverse) }                                       
486         end
487         execute sql, name
488       end
4

0 に答える 0