0

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

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

undefined method 'new' for nil:NilClass

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

我知道错误与回形针有关,因为只要我在我的视频模型中注释掉以下代码,一切正常:

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.rb文件的放置和/或配置是否不正确paperclip.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?我会喜欢任何指导/建议。

4

1 回答 1

0

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

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。

希望这可以帮助。

于 2013-04-06T14:48:24.737 回答