Почему все строки ASCII-8BIT после обновления до Rails 3? - PullRequest
7 голосов
/ 22 октября 2010

Я обновился до RoR 3.0.1 и Ruby до 1.9.2. Теперь все строки в моих представлениях являются ASCII-8BIT?

Я считаю, что мое приложение настроено на использование UTF 8

application.rb

config.encoding = "utf-8"

database.yml

development:
  adapter: mysql
  encoding: utf8

Я бегу

OS X
RVM rvm 1.0.16 
Ruby ruby-1.9.2-p0
Rails 3.0.1

Я ожидаю, что кодирование будет UTF 8, а не ASCII

business.desc.encoding
# ASCII-8BIT

Поскольку 1.9.x может объединять строки различных кодировок, мы видим много ошибок, подобных этой.

<p class="description"><%= truncate(business.desc, :length => 17) %></p>

Ошибка

incompatible character encodings: ASCII-8BIT and UTF-8

activesupport (3.0.1) lib/active_support/core_ext/string/output_safety.rb:74:in `concat'
activesupport (3.0.1) lib/active_support/core_ext/string/output_safety.rb:74:in `concat'
actionpack (3.0.1) lib/action_view/template/handlers/erb.rb:14:in `<<'
app/views/browse/businesses.html.erb:15:in `block in _app_views_browse_businesses_html_erb___1616718260917998189_2173630500__1134905695726531092'
app/views/browse/businesses.html.erb:3:in `each'
app/views/browse/businesses.html.erb:3:in `each_with_index'
app/views/browse/businesses.html.erb:3:in `_app_views_browse_businesses_html_erb___1616718260917998189_2173630500__1134905695726531092'

У кого-нибудь еще есть эта проблема?Является ли ruby-1.9.2-p0 верной версией для использования?

Спасибо!

Ответы [ 3 ]

6 голосов
/ 11 ноября 2010

ужасная проблема. Вы должны поместить это вверху каждого файла

# coding: UTF-8

ОБНОВЛЕНИЕ Используйте magic_encoding как описано для Nerian.

По сути то же самое, что и ниже, но лучше.

/ UPDATE

У меня есть задание на грабли, я не помню, где я нашел (похвала этому парню!), Который я немного изменил, чтобы это было над каждым файлом. Я слышал, что люди говорят, что вышеизложенного (то, что вы сделали) должно быть достаточно, но у меня это не работает ...

Во всяком случае, это грабли, просто скопируйте и вставьте


lib/tasks/utf8encode.rake

# coding: UTF-8

desc "Manage the encoding header of Ruby files"
task :utf8_encode_headers => :environment do
  files = Array.new
  ["*.rb", "*.rake"].each do |extension|
    files.concat(Dir[ File.join(Dir.getwd.split(/\\/), "**", extension) ])
  end

  files.each do |file|
    content = File.read(file)
    next if content[0..16] == "# coding: UTF-8\n\n" ||
            content[0..22] == "# -*- coding: utf-8 -*-"

   ["\n\n", "\n"].each do |file_end|
      content = content.gsub(/(# encoding: UTF-8#{file_end})|(# coding: UTF-8#{file_end})|(# -*- coding: UTF-8 -*-#{file_end})|(# -*- coding: utf-8 -*-#{file_end})/i, "")
    end

    new_file = File.open(file, "w")
    new_file.write("# coding: UTF-8\n\n"+content)
    new_file.close
  end
end
4 голосов
/ 08 января 2011

Вы должны добавить это к каждому файлу .rb:

<% # coding: UTF-8 %>

Для этого я использую gem magic_encoding.

$ cd app/ 
$ magic_encoding

По умолчанию используется UTF-8, но вы можете указать в качестве аргумента все, что захотите.

2 голосов
/ 08 января 2011

Я перехожу с Ruby 1.8.6 и Rails 2.3.5 на Ruby 1.9.2 и Rails 3.0.3 с postregsql. Чтобы это работало над моим проектом, мне нужно было добавить это в начало любого из моих шаблонов представления, которые переводились:

<% # coding: UTF-8 %>

Задача rake, предоставляемая Ole, также должна быть легко модифицирована, чтобы сделать это. Я не нашел его решения, поскольку данное имело какой-либо эффект.

...