Rails:文件名中的image_tag helper / umlaut会在生产中引发错误

时间:2011-09-14 21:04:16

标签: ruby-on-rails file-upload utf-8 heroku production

我正在Heroku上的Rails 3应用程序中通过dragonfly上传包含变音符号的文件名的图像。然后我尝试使用

显示图像
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 个答案:

答案 0 :(得分:1)

好吧,你可以试试像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会在model.rb文件中抱怨非ASCII字符......

答案 1 :(得分:1)

除了@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.htmlhttp://guides.rubyonrails.org/security.html#file-uploads