2010-08-18 32 views
5

Tôi vừa bắt đầu quá trình nâng cấp từ Ruby 1.8.7 lên Ruby 1.9.2 (sử dụng RVM). Tôi có tất cả các ứng dụng đang chạy bằng 'script/server' (hoặc 'rails server') với 1.9.2, tuy nhiên, chỉ các ứng dụng Rails 3.0.0 RC hoạt động với Passenger. Các thông báo lỗi do Rails 2.3.8 ứng dụng là:RVM, Ruby 1.9.2, Rails 2.3.8, Hành khách và "chuỗi byte không hợp lệ trong US-ASCII"

không hợp lệ byte chuỗi trong US-ASCII

Tôi đoán rằng đây là một vấn đề hành khách. Tôi đã lắp đặt Hành khách 2.2.15 bằng hướng dẫn RVM được tìm thấy here. Bất kỳ ý tưởng làm thế nào để sửa lỗi này? Cảm ơn. Tôi đã cập nhật để bao gồm dấu vết ngăn xếp:

/Users/kevin/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-2.3.8/lib/action_view/template_handlers/erb.rb:14:in `compile' 
/Users/kevin/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-2.3.8/lib/action_view/template_handler.rb:11:in `call' 
/Users/kevin/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-2.3.8/lib/action_view/renderable.rb:19:in `compiled_source' 
/Users/kevin/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-2.3.8/lib/action_view/renderable.rb:68:in `compile!' 
/Users/kevin/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-2.3.8/lib/action_view/renderable.rb:61:in `compile' 
/Users/kevin/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-2.3.8/lib/action_view/renderable.rb:28:in `render' 
/Users/kevin/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-2.3.8/lib/action_view/template.rb:205:in `render_template' 
/Users/kevin/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-2.3.8/lib/action_view/base.rb:265:in `render' 
/Users/kevin/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-2.3.8/lib/action_view/base.rb:352:in `_render_with_layout' 
/Users/kevin/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-2.3.8/lib/action_view/base.rb:262:in `render' 
/Users/kevin/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-2.3.8/lib/action_controller/base.rb:1250:in `render_for_file' 
/Users/kevin/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-2.3.8/lib/action_controller/base.rb:942:in `render' 
/Users/kevin/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-2.3.8/lib/action_controller/benchmarking.rb:51:in `block in render_with_benchmark' 
/Users/kevin/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-2.3.8/lib/active_support/core_ext/benchmark.rb:17:in `block in ms' 
/Users/kevin/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/benchmark.rb:309:in `realtime' 
/Users/kevin/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-2.3.8/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
/Users/kevin/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-2.3.8/lib/action_controller/benchmarking.rb:51:in `render_with_benchmark' 
/Users/kevin/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-2.3.8/lib/action_controller/mime_responds.rb:135:in `block in custom' 
/Users/kevin/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-2.3.8/lib/action_controller/mime_responds.rb:179:in `call' 
/Users/kevin/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-2.3.8/lib/action_controller/mime_responds.rb:179:in `block in respond' 
/Users/kevin/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-2.3.8/lib/action_controller/mime_responds.rb:173:in `each' 
/Users/kevin/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-2.3.8/lib/action_controller/mime_responds.rb:173:in `respond' 
/Users/kevin/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-2.3.8/lib/action_controller/mime_responds.rb:107:in `respond_to' 
/Users/kevin/Sites/sample/app/controllers/main_controller.rb:7:in `index' 
+0

Bất kỳ thông tin nào khác về lỗi? Nó xảy ra ở đâu? Stack dấu vết có lẽ? –

+0

Chỉ cần cập nhật để bao gồm nó. –

Trả lời

6

Hãy thử thêm

# encoding: UTF-8
ở đầu tệp main_controller.rb của bạn. Nếu nó hoạt động, bạn đang xử lý một ký tự ASCII không phải của Mỹ trong tệp nguồn của bạn.

Trong Ruby 1.9, chúng tôi đang làm việc với ba bối cảnh mã hóa: mã mã hóa

  • Nguồn: Strings trong một tập tin nguồn được hiểu là US-ASCII theo mặc định, trừ trường hợp bình luận magic tôi liệt kê ở trên là hiện tại .
  • Mã hóa bên ngoài: Các ký tự trong tệp văn bản được giả định là mã hóa giống như môi trường. Tuy nhiên người ta có thể chỉ định mã hóa để sử dụng. Ví dụ: mở (mydata.txt, "r: UTF-8").
  • Mã hóa nội bộ: Quy định cụ thể cách dữ liệu văn bản được mã hóa khi đọc từ một tệp. Theo mặc định, đây là số không, có nghĩa là nó sẽ giống như mã hóa được sử dụng để đọc nó. Nếu một cái gì đó khác nhau là cần thiết, nó có thể được xác định trong IO.open. Ví dụ: mở (mydata.txt, 'r: UTF-8: UTF-16LE')

Để biết thêm thông tin, tôi muốn đọc James Edward Gray II's great articles trên mã hóa.

+1

Cảm ơn, nhưng tôi không có bất kỳ ký tự ASCII không phải của Hoa Kỳ nào trong các tệp nguồn. Tôi nghĩ rằng nó phải là một vấn đề hành khách (cho rằng tất cả các dự án chạy tốt dưới mongrel). –

1

Chào mừng bạn đến với thế giới tuyệt vời của mã hóa chuỗi buộc; lỗi này là sự khác biệt về hành vi của Ruby 1.9.x so với Ruby 1.8.x trong chuỗi.

Kiểm tra http://blog.phusion.nl/2009/02/02/getting-ready-for-ruby-191/ - có thể hữu ích. Bạn có thể chỉ cần cập nhật gemset của bạn.

+0

Đây có phải là vấn đề với viên đá quý chở khách không? Các ứng dụng xuất hiện để chạy tốt bằng cách sử dụng được xây dựng trong Mongreal (script/server). Ngoài ra nó dường như không giải thích tại sao các ứng dụng RC 3.0.0 đang hoạt động. Bất kỳ ý tưởng? –

2

Tôi đồng ý với pjmorse về nguyên nhân biến môi trường, đặc biệt trong thiết lập Hành khách/Đường ray của tôi, thủ phạm là giá trị LANG.

Khi khởi động ứng dụng Rails thông qua tập lệnh/máy chủ, tôi có LANG = en_CA.UTF-8, nhưng không phải khi nâng ứng dụng lên với Hành khách.

Giải pháp: Sửa đổi các cấu hình hành khách để bắt đầu Ruby với một wrapper, xem http://blog.phusion.nl/2008/12/16/passing-environment-variables-to-ruby-from-phusion-passenger/

Sử dụng này như là một wrapper:

#!/bin/sh 
export LANG=en_CA.UTF-8 
exec "/Your_Default_Ruby_Path/ruby" "[email protected]" 

Note Your_Default_Ruby_Path là bất cứ điều gì là giá trị PassengerRuby của http. conf trước khi bạn thiết lập trình bao bọc.

5

Tôi gặp vấn đề tương tự trên Ubuntu (11.10) bởi vì đây là trong tôi/etc/apache2/envvars:

## The locale used by some modules like mod_dav 
export LANG=C 
## Uncomment the following line to use the system default locale instead: 
#. /etc/default/locale 

Việc trao đổi các ý kiến ​​trên một này để sử dụng/etc/default/locale (trong đó có LANG="en_US.UTF-8") giải quyết các vấn đề đối với tôi mà không cần phải làm cho một wrapper cho ruby ​​của tôi.

+0

Câu trả lời này làm việc cho tôi trên ubuntu 12.04 với một ứng dụng 3.2 đường ray chạy trong ruby ​​1.9.3. Có các ký tự được mã hóa UTF-8 trong gemspecs cho một số đá quý được sử dụng trong ứng dụng. –

+1

Phát ngay! Cảm ơn vì điều đó, đã cứu rất nhiều đau đớn. –

Các vấn đề liên quan