Ошибка кодирования в Rails 3

#ruby-on-rails #ruby #testing #encoding #utf-8

#ruby-on-rails #ruby #тестирование #кодирование #utf-8

Вопрос:

Я запустил свою программу, и все работает отлично. Сейчас я пытаюсь написать несколько тестов, и я продолжаю получать эту ошибку:

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

Насколько мне известно, я не использую никаких странных символов. Я даже не знаю, с чего начать с этой ошибкой. Я попытался добавить эти две строки в файл environment.rb:

 Encoding.default_internal = Encoding::UTF_8
Encoding.default_external = Encoding::UTF_8
  

и это не помогло. Вот тест, который я пытаюсь запустить:

 require 'test_helper'

class UserTest < ActiveSupport::TestCase
  test "should require all fields" do
    u = User.new
    assert_false u.valid?
  end
end
  

вот мой файл users.yml:

 one:
  name: MyString
  password: MyString

two:
  name: MyString
  password: MyString

<% (1..5).each do |i| %>
  user_<%= i %>:
    name: user_<%= i %>
    password: user_<%= i %>
<% end %>
  

вот моя трассировка стека:

 Creating sqlite :memory: database
-- create_table("comment_votes", {:force=>true})
   -> 0.0021s
-- create_table("comments", {:force=>true})
   -> 0.0013s
-- add_index("comments", ["post_id"], {:name=>"index_comments_on_post_id"})
   -> 0.0005s
-- create_table("posts", {:force=>true})
   -> 0.0015s
-- create_table("users", {:force=>true})
   -> 0.0013s
-- create_table("votes", {:force=>true})
   -> 0.0010s
-- initialize_schema_migrations_table()
   -> 0.0009s
-- assume_migrated_upto_version(20111005200722, ["db/migrate"])
   -> 0.0013s

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

1 тесты, 0 утверждений, 0 сбоев, 1 ошибки, 0 зависаний, 0 пропусков, 0 уведомлений

Набор тестов завершен: 0,058747 секунды

Процесс завершен с кодом выхода 1

Ответ №1:

Ваши пароли соленые? И случайно ли соль использует случайные байты, которые могут не соответствовать UTF-8 или US-ASCII? Это меня уже раньше настигало. Мне пришлось force_encoding("BINARY") использовать свои соли пароля.

Комментарии:

1. Ну, я использовал DataMapper, а не ActiveRecord, так что в моем случае это была ошибка в DM, для которой я отправил патч . Может быть, попробуйте определить password_salt= (или какое бы то ни было поле) password_salt и сделать это там?

2. Можете ли вы опубликовать логику ввода пароля и проверки? Тогда я, вероятно, смогу помочь больше.

3. здесь я генерирую соль: def generate_salt self . соль = self.object_id.to_s rand.to_s конец

4. Я использую SHA2 для шифрования пароля

5. Ах, это не должно иметь значения, поскольку в любом случае это допустимый UTF-8. Проблема, должно быть, исходит откуда-то еще. У вас есть трассировка стека?