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并仍然遇到同样的错误。
答案 0 :(得分:3)
你排除了:
这个错误似乎来自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'
为我解决了这个问题。