【问题标题】:Issues with Globalize and CarrierWave uploads in Rails 4.2 appRails 4.2 应用程序中的 Globalize 和 CarrierWave 上传问题
【发布时间】:2018-03-29 18:12:44
【问题描述】:

我的 Rails 4.2 应用程序中的翻译文件有问题。

背景

这是我正在使用的 gem 版本:

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 类返回。

呼救声

帮助! ????

【问题讨论】:

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


    【解决方案1】:

    我写了这个简单的 gem https://github.com/dalpo/carrierwave_globalize。它应该允许一起使用 GlobalizeCarrierwave

    您必须使用 CarrierwaveGlobalize 模块扩展您的模型,并使用mount_translated_uploader 类方法来安装您的carrierwave 上传器,而不是使用mount_uploader 方法。

    请按照自述文件中的说明获取更多信息。

    【讨论】:

      【解决方案2】:

      老问题,但是...不要在同一属性上使用 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-15
        • 2013-06-27
        • 1970-01-01
        • 2017-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-25
        相关资源
        最近更新 更多