我正在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中运行得很好吗?
答案 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.html和http://guides.rubyonrails.org/security.html#file-uploads。