Rails: image_tag helper / umlaut в имени файла выдает ошибку в работе - PullRequest
2 голосов
/ 15 сентября 2011

Я загружаю изображение с именем файла, содержащим умлаут, через dragonfly в приложении Rails 3 на Heroku. Затем я пытаюсь отобразить изображение, используя

image_tag @model.image.url, …

В разработке все работает просто отлично, но в производстве я получаю:

incompatible character encodings: UTF-8 and ASCII-8BIT
.bundle/gems/ruby/1.9.1/gems/actionpack-3.0.7/lib/action_view/helpers/tag_helper.rb:129:in `*'

Прочитав немного, я добавил

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

в environment.rb, но проблема остается.

Как правильно это сделать? Нужно ли исправлять имя файла при загрузке? У меня сложилось впечатление, что это должно нормально работать в Rails 3?

Ответы [ 2 ]

1 голос
/ 15 сентября 2011

В дополнение к ответу @ Rhywden, вот мое решение для Dragonfly:

image_accessor :image do :after_assign
  after_assign{|i| i.name = sanitize_filename(image.name) }
end

def sanitize_filename(filename)
  filename.strip.tap do |name|
    name.sub! /\A.*(\\|\/)/, ''
    name.gsub! /[^\w\.\-]/, '_'
  end
end

Подробности здесь http://markevans.github.com/dragonfly/file.Models.html и здесь http://guides.rubyonrails.org/security.html#file-uploads.

1 голос
/ 15 сентября 2011

Ну, вы можете попробовать что-то вроде url.force_encoding('utf8')

Вы также можете просто санировать URL-адрес в модели, прежде чем сохранять его в базе данных - вот что я сделал. И да, я иногда спотыкаюсь об этом и в самых странных местах.

Вот как выглядела моя модель:

# encoding: UTF-8
class Page < ActiveRecord::Base
  before_save :sanitize_title

  private
  def sanitize_title
    self.title = self.title.force_encoding('UTF-8').downcase.gsub(/[ \-äöüß]/, ' ' => '_', '-' => '_', 'ä' => 'ae', 'ö' => 'oe', 'ü' => 'ue', 'ß' => 'ss').gsub(/[^a-z_]/,'')
  end
end

Это заменит германские умлауты их аналогами ASCII, преобразует пробелы в подчеркивания и отбрасывает все остальное. Первая строка # encoding: UTF-8 важна, иначе ruby ​​будет жаловаться на символы не ASCII в файле model.rb ...

...