2011-12-13 15 views
0

は私がポーリングの結果はフォースクエア会場のAPIですJSON文字列取っている:あなたが言うことができるように、いくつかの非標準があるMongoidとUTF-8のJRuby on Railsのアプリで問題

{ 
    "id"=>"4e404742c65b4ec27606deb4", 
    "name"=>"Sarah's Cheesecake & Cafe", 
    "contact"=>{ 
     "phone"=>"4134436678", 
     "formattedPhone"=>"(413) 443-6678" 
    }, 
    "location"=>{ 
     "address"=>"180 Elm St", 
     "lat"=>42.44345873, 
     "lng"=>-73.23804678, 
     "distance"=>1063, 
     "postalCode"=>"01201", 
     "city"=>"Pittsfield", 
     "state"=>"MA" 
    }, 
    "categories"=>[ 
     { 
      "id"=>"4bf58dd8d48988d16d941735", 
      "name"=>"Café", 
      "pluralName"=>"Cafés", 
      "shortName"=>"Café", 
      "icon"=>{ 
       "prefix"=>"https://foursquare.com/img/categories/food/cafe_", 
       "sizes"=>[ 
        32, 
        44, 
        64, 
        88, 
        256 
       ], 
       "name"=>".png" 
      }, 
      "primary"=>true 
     } 
    ], 
    "verified"=>false, 
    "stats"=>{ 
     "checkinsCount"=>7, 
     "usersCount"=>5, 
     "tipCount"=>0 
    }, 
    "hereNow"=>{ 
     "count"=>0 
    } 
} 

をそこにはCafésなどの文字があり、このJRuby on RailsアプリでMongoidベースのモデルが壊れています。 MyModel.createを使用してインスタンスを作成しようとするとき、ここで私は何を得るのですか。

jruby-1.6.5 :012 > FoursquareVenue.create(hash) 
Java::JavaLang::NullPointerException: 
    from org.jruby.exceptions.RaiseException.<init>(RaiseException.java:101) 
    from org.jruby.Ruby.newRaiseException(Ruby.java:3348) 
    from org.jruby.Ruby.newEncodingCompatibilityError(Ruby.java:3323) 
    from org.jruby.RubyString.cat(RubyString.java:1285) 
    from org.jruby.RubyString.cat19(RubyString.java:1221) 
    from org.jruby.RubyHash$5.visit(RubyHash.java:727) 
    from org.jruby.RubyHash.visitAll(RubyHash.java:594) 
    from org.jruby.RubyHash.inspectHash(RubyHash.java:721) 
    from org.jruby.RubyHash.inspect(RubyHash.java:745) 
    from org.jruby.RubyHash$i$0$0$inspect.call(RubyHash$i$0$0$inspect.gen:65535) 
    from org.jruby.RubyClass.finvoke(RubyClass.java:632) 
    from org.jruby.javasupport.util.RuntimeHelpers.invoke(RuntimeHelpers.java:545) 
    from org.jruby.RubyBasicObject.callMethod(RubyBasicObject.java:353) 
    from org.jruby.RubyObject.inspect(RubyObject.java:408) 
    from org.jruby.RubyArray.inspectAry(RubyArray.java:1483) 
    from org.jruby.RubyArray.inspect(RubyArray.java:1509) 
... 420 levels... 
    from org.jruby.evaluator.ASTInterpreter.INTERPRET_METHOD(ASTInterpreter.java:75) 
    from org.jruby.internal.runtime.methods.InterpretedMethod.call(InterpretedMethod.java:190) 
    from org.jruby.internal.runtime.methods.DefaultMethod.call(DefaultMethod.java:179) 
    from org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.java:312) 
    from org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:169) 
    from usr.local.rvm.rubies.jruby_minus_1_dot_6_dot_5.bin.jirb.__file__(/usr/local/rvm/rubies/jruby-1.6.5/bin/jirb:17) 
    from usr.local.rvm.rubies.jruby_minus_1_dot_6_dot_5.bin.jirb.load(/usr/local/rvm/rubies/jruby-1.6.5/bin/jirb) 
    from org.jruby.Ruby.runScript(Ruby.java:693) 
    from org.jruby.Ruby.runScript(Ruby.java:686) 
    from org.jruby.Ruby.runNormally(Ruby.java:593) 
    from org.jruby.Ruby.runFromMain(Ruby.java:442) 
    from org.jruby.Main.doRunFromMain(Main.java:321) 
    from org.jruby.Main.internalRun(Main.java:241) 
    from org.jruby.Main.run(Main.java:207) 
    from org.jruby.Main.run(Main.java:191) 
    from org.jruby.Main.main(Main.java:171) 

すべての奇数文字を削除すると、すべて正常に動作し、例外はスローされません。これを処理する適切な方法は何ですか? Mongoid/MongoDB文書をUTF-8で使用できるようにすることはできますか?それが不可能であれば、どういうわけか、最初にそれらを「昇格」させる必要がありますか?

答えて

0

gem install bson_extが参考になる場合があります。

出典:MongoDB, Ruby and UTF-8

あなたがUbuntuの使用している場合、あなたはSpiderMonkeyの/ MongoDBのインストールにいくつかの追加の手順を実行する必要があります。

JavascriptのSpiderMonkeyのライブラリがUTF-8を持っていない、ほとんど事前に構築された

サポートはコンパイルされました。 MongoDBはこれを必要とします。

出典:Building for Linux

+0

すでに私のGemfileにbson_extが指定されています – randombits

+0

ubuntuを使用していますか? – zengr

+0

いいえ、これは私のプロダクト環境(RHEL)とステージング(OSX Lion)の両方で再現可能です – randombits

1

はJRubyの1.9モードでエンコーディングのバグである可能性があります。あなたは1.8モードでそれを実行すると同じことが起こりますか?どちらの方法でも、スタックトレースはバグとしてhttp://bugs.jruby.orgに提出する必要があります。ありがとう!

+0

こんにちはニック、私はまだ1.8モードですべてを実行しています:jruby 1.6.5(ruby-1.8.7-p330)(2011-10-25 9dcd388)(OpenJDK 64ビットサーバVM 1.6.0_20)[linux-amd64 -java] – randombits

0

mongoDBとmongoidがutf-8を正しく処理します。私はQuimbyラッパーを使って、ずっと前からFoursquare APIで同じことをやっていました。

その結果、私はバグがJRubyの使用と密接に関係していると思われます。

0

UTF8を使用するようにJRubyをセットアップしましたか?

require 'jcode' 
$KCODE = 'u'