【问题标题】:Rails app using Paperclip running on Windows Azure VM使用在 Windows Azure VM 上运行的 Paperclip 的 Rails 应用程序
【发布时间】:2013-03-19 04:56:05
【问题描述】:

我有一个在 Windows Azure 虚拟机上运行的 Ruby (1.9.3) on Rails (3.2.9) 应用程序(使用 Ruby-Stack-1-9-3-6-Ubuntu-12-10 映像)。我可以使用 Capistrano 成功部署到 VM,但在文件上传和 Azure 存储方面遇到了困难。

我正在尝试实现 paperclip-azure-storage gem,它使用 waz-storage gem,但似乎无法克服此错误:

undefined method 'new' for nil:NilClass

每当我尝试创建/更新/销毁 Video 对象(使用简单的 Rails 表单)时,都会出现此错误。为了澄清,我在本地机器和虚拟机实例上都收到了这个错误。

我知道错误在于 Paperclip,因为只要我在视频模型中注释掉以下代码,一切正常:

has_attached_file :pic, :storage => :azure1

按照两个 gem 来源的说明(上面的链接),我添加了以下文件:

  • azure.yml(包含我的 Azure 存储帐户名称和访问密钥)
  • storage.rb(复制自 paperclip-azure-storage gem 并添加到 /lib/paperclip)
  • paperclip.rb(也从 paperclip-azure-storage gem 复制并添加到初始化器列表中)

涵盖基础知识:

  • Gemfile: gem 'paperclip' 刚刚更新到 3.4.1 版
  • 在表单中:<%= form_for @video, html: { multipart: true } do |video_form| %> 尝试使用和不使用 url 选项。
  • 在每个环境文件中:Paperclip.options[:command_path] = "/opt/local/bin/convert"
  • 架构:已验证以确保 pic 附件已正确添加到视频表中

我一直在不知疲倦地寻找答案,但似乎找不到问题的根源。是不是 ImageMagick 没有正确安装? storage.rbpaperclip.rb 文件的放置和/或配置是否不正确?还是完全是别的东西?

这是我的 paperclip.rb 初始化程序中的代码:

module Paperclip
  class Attachment
    def self.default_options
      @default_options ||= {
        :styles            => {},
        :processors        => [:thumbnail],
        :convert_options   => {},
        :default_url       => "/rails.png",
        :default_style     => :original,
        :whiny             => Paperclip.options[:whiny] || Paperclip.options[:whiny_thumbnails],
        :storage           => :azure1,
        :path              => ":modelname/:attachment/:id/:style/:filename",        
        :azure_credentials => "#{Rails.root}/config/azure.yml",
        :azure_container   => "system",
        :azure_host_alias  => "name_of_azure_storage.blob.core.windows.net",
        :url               => ':azure_domain_url',
      }
    end    
  end
end

如果需要,我很乐意发布其他代码。

有没有人尝试/成功使用 Windows Azure 实现上述 gem?我希望得到任何指导/建议。

【问题讨论】:

    标签: ruby-on-rails azure imagemagick paperclip azure-storage


    【解决方案1】:

    问题似乎是当你使用格式时:

    module Paperclip
      class attachment
        ...
      end
    end
    

    不会创建 Paperclip 的内部默认选项。然后它会尝试实例化通常在这些内部默认选项中定义的 URL 生成器,这会导致您看到的错误。

    为了解决这个问题,我将初始化程序格式化如下:

    Paperclip::Attachment.default_options[:processors] = [:thumbnail]
    Paperclip::Attachment.default_options[:convert_options] = {}
    Paperclip::Attachment.default_options[:styles] = {}
    Paperclip::Attachment.default_options[:default_url] = "/rails.png"
    Paperclip::Attachment.default_options[:default_style] = :original
    Paperclip::Attachment.default_options[:whiny] = Paperclip.options[:whiny] || Paperclip.options[:whiny_thumbnails]
    Paperclip::Attachment.default_options[:storage] = :azure1
    Paperclip::Attachment.default_options[:path] = ":modelname/:attachment/:id/:style/:filename"
    Paperclip::Attachment.default_options[:azure_credentials] = "#{Rails.root}/config/azure.yml"
    Paperclip::Attachment.default_options[:azure_container] = "system"
    Paperclip::Attachment.default_options[:azure_host_alias] = "storageaccount.blob.core.windows.net"
    Paperclip::Attachment.default_options[:url] = ':azure_domain_url'
    

    这允许默认选项与我的初始化程序中的选项成功创建/合并,并让我克服了那个错误。

    由于我使用的是最新版本的 rails,接下来我遇到了 RAILS_ROOT 和 RAILS_ENV 错误,因此我调整了上述初始化程序位以使用 Rails.root 并将回形针-azure-storage 更改为使用 Rails.env RAILS_ENV。

    希望这会有所帮助。

    【讨论】:

    • 有趣。这是我从来没有想过的。当我有机会时,我会试试这个。实际上,我切换到 Carrierwave 并发现实现起来要容易得多。不过,感谢您的回复,我肯定会试一试,因为整件事让我发疯了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 2021-12-21
    相关资源
    最近更新 更多