Проблемы с загрузками Globalize и CarrierWave в приложении Rails 4.2

У меня проблемы с переведенными файлами в моем приложении 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. На мой взгляд, я хочу перечислить Download и все текущие переводы для этой загрузки, но все, что я получаю, это данные о текущей локали для каждого перевода. В консоли 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 при доступе к нему.

Крик о помощи

Помогите!

2 ответа

Я написал этот простой камень https://github.com/dalpo/carrierwave_globalize. который он должен позволять использовать Globalize и Carrierwave вместе.

Вы должны расширить свою модель с помощью модуля CarrierwaveGlobalize и использовать mount_translated_uploader метод класса, чтобы смонтировать ваш загрузчик несущей вместо mount_uploader mehtod.

Следуйте инструкциям в readme для получения дополнительной информации.

Старый вопрос, но... не используйте Globalize с 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
Другие вопросы по тегам