Rails 4.2 app

时间:2015-07-21 22:11:27

标签: carrierwave ruby-on-rails-4.2 globalize

我的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

问题

  1. 在我看来,我想列出下载以及该下载的所有当前翻译,但我得到的只是每个翻译的当前区域设置数据。在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
    
  2. 如果我更改上传器在我的模型中的安装方式:

    Translation.mount_uploader :file, DownloadFileUploader
    

    现有翻译列表正确 - 包括文件,但我不能上传文件。存储在数据库中的是:

     /uploads/download/translation/file/401/%23%3CActionDispatch%3A%3AHttp%3A%3AUploadedFile%3A0x007f9c12e6fe00%3E
    

    请注意,它会在路径中插入/translation,我可以在上传器中修复,但文件名实际上不是文件。

  3. 如果我在模型中移动translates :title, :part_number, :file mount_uploader :file, DownloadFileUploader下方,则Globalize会覆盖已装载的上传器,并在访问时将该列作为类String返回它

  4. 寻求帮助

    帮助!

2 个答案:

答案 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