Rails视图不会在Passenger后面呈现。错误:格式错误的UTF-8

时间:2014-02-11 23:49:12

标签: ruby-on-rails apache encoding nginx passenger

My Rails应用程序在生产和开发中连接到相同的MS SQL数据库 在开发中(在我的Mac上)我能够渲染/clients/active.json视图(通过rabl) 但是在生产中(在Passenger / Apache之后)我收到此错误:

Started GET "/clients/active.json"
Processing by ClientsController#active as JSON
  Rendered clients/active.json.rabl (204.6ms)
Completed 500 Internal Server Error in 206.3ms

ActionView::Template::Error (source sequence is illegal/malformed utf-8):
    1: collection @clients
    2: extends 'clients/index'
  app/views/clients/active.json.rabl:1:in `_app_views_clients_active_json_rabl__626601527_78036080'

数据库是只读的,不受我控制。有没有办法在生产中渲染JSON,就像在我的开发机器上一样?

修改
我切换到Nginx并仍然遇到同样的错误。

3 个答案:

答案 0 :(得分:3)

你排除了:

  • 乘客(通过尝试Nginx)
  • 数据库(因为你使用的是同一个)
  • Rabl / Rails(可能,假设相同的代码部署到生产中)

这个错误似乎来自ruby JSON生成器,我看到了:

因此可能在

中统治
  • 操作系统或配置的差异
  • 或更可能的软件版本

第一个最重要的问题是:Mac上哪个版本的ruby与服务器?在ruby 1.8和1.9之间处理字符集编码的方式发生了重大变化。

但如果服务器在1.8上,而Mac在1.9+上,那么这很可能就是为什么会出现差异。更新到1.9或2.0,我敢打赌系统的行为会相同。

如果两者都是1.9.2或更高,那么我不仅会考虑宝石版本(如果你正在部署Gemfile.lock,它应该是相同的),但是使用哪些库来构建宝石。见this similar bug report suggesting compiler flags。实际上,如果两者都处于红宝石1.8中,则可能会导致相同的原因。

使用1.9.2,您可以force_encoding使用{{1}}。

如果这不起作用,您可以诉诸described in painful detail here by our hero, Yehuda Katz - 捕获异常。这可能需要在控制器中完成,除非你想要猴子路径Rabl(我推荐:-)。有关此错误可能来自的地方的详细信息,solution/workaround found for another LogStash post

我的钱是红宝石版本。

祝你好运!!!

答案 1 :(得分:0)

检查您的系统环境语言。

最有可能的应该是 LANG =的en_US.UTF-8

您可以通过发出" env"来检查在你的系统中

env |grep LANG

如果没有设置,请设置它。

export LANG=en_US.UTF-8

或者,您可以发出此命令" locale"

这是我的输出

LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

要考虑的另一个项目是应用程序的环境设置。

我确保config / production.rb中没有覆盖系统默认值的设置。

也许您可以将config / development.rb复制到config / production.rb并重新启动服务器来执行此操作。否则,请注意它并确保生产中没有任何可疑之处.rb

如果这些都不起作用,那可能是个错误? https://code.google.com/p/phusion-passenger/issues/detail?id=872

答案 2 :(得分:0)

我在搜索类似的问题时发现了这个问题"格式错误的utf-8"和RABL

解决方案是替换默认的JSON Generator(在rabl的github wiki中推荐)。

一个简单的

#Gemfile
gem 'oj'

为我解决了这个问题。