我的Rails 4.2应用程序中的翻译文件存在问题。
以下是我正在使用的宝石版本:
gem "rails", "4.2.1"
gem "carrierwave" # 0.10.0
gem "globalize" # 5.0.1
我的模特:
class Download < ActiveRecord::Base
belongs_to :download_type
has_and_belongs_to_many :products
translates :title, :part_number, :file
mount_uploader :file, DownloadFileUploader
validates :title, presence: true
def to_param
"#{id}-#{title.parameterize}"
end
end
在我看来,我想列出下载以及该下载的所有当前翻译,但我得到的只是每个翻译的当前区域设置数据。在Rails控制台中:
> I18n.locale
=> :en
> download = Download.find(481)
=> #<Download id: 481, title: "SmartSensor HD Quick-reference Guide (User)", part_number: "WX-500-0171", download_type_id: 3, created_at: "2015-01-16 22:49:13", updated_at: "2015-04-20 16:59:25", file: "smartsensor_hd_user_quick-reference_guide-20150116...", download_updated_at: nil>
> download.translations.count
=> 8
> download.translated_locales
=> [:de, :en, :es, :fr, :it, :pt, :ru, :"zh-CN"]
> download.file.class
=> DownloadFileUploader
> download.file.url
=> "/uploads/download/file/481/smartsensor_hd_user_quick-reference_guide-20150116154913-en.pdf"
> download.title
=> "SmartSensor HD Quick-reference Guide (User)"
> download.part_number
=> "WX-500-0171"
当语言环境发生变化时:
> I18n.locale = :de
=> :de
> download.file.class
=> DownloadFileUploader
> download.file.url
=> "/uploads/download/file/481/smartsensor_hd_user_quick-reference_guide-20150116154913-en.pdf"
> download.title
=> "SmartSensor HD Kurzanleitung"
> download.part_number
=> "WX-502-0006"
如果我尝试直接访问翻译:
> I18n.locale = :de
=> :de
> download.translation.file.class
=> String
如果我更改上传器在我的模型中的安装方式:
Translation.mount_uploader :file, DownloadFileUploader
现有翻译列表正确 - 包括文件,但我不能上传文件。存储在数据库中的是:
/uploads/download/translation/file/401/%23%3CActionDispatch%3A%3AHttp%3A%3AUploadedFile%3A0x007f9c12e6fe00%3E
请注意,它会在路径中插入/translation
,我可以在上传器中修复,但文件名实际上不是文件。
如果我在模型中移动translates :title, :part_number, :file
mount_uploader :file, DownloadFileUploader
下方,则Globalize会覆盖已装载的上传器,并在访问时将该列作为类String
返回它
帮助!
答案 0 :(得分:1)
我写了这个简单的宝石https://github.com/dalpo/carrierwave_globalize。它应该允许一起使用全球化和 Carrierwave 。
您必须使用 CarrierwaveGlobalize 模块扩展您的模型,并使用mount_translated_uploader
类方法来安装您的carrierwave上传器而不是mount_uploader
mehtod。
按照自述文件中的说明获取更多信息。
答案 1 :(得分:0)
旧问题,但是......不要在同一属性上使用Globalize with CarrierWave,它们都会覆盖默认行为。
您可以在模型中执行此操作:
class Download < ActiveRecord::Base
belongs_to :download_type
has_and_belongs_to_many :products
translates :title, :part_number
mount_uploader :file, DownloadFileUploader
validates :title, presence: true
def to_param
"#{id}-#{title.parameterize}"
end
end
然后覆盖系统中上传者的文件存储,以使用I18n.locale:
def store_dir
"uploads/#{I18n.locale}/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end