0

我有一个使用AWS S3 gem的类,并且在我的类中有几个使用 gem 的方法。我的问题是,我不想在多个位置配置它,而是想让它成为我的对象的属性。

在 PHP 中,我们会这样做;

<?php
  class myClass {

    private $obj;

    public function __construct() {
      $this->obj = new Object();
    }
  }
?>

然后我可以在 myClass 的任何地方使用 $this->obj->method()。

我很难像在 ruby​​ 中工作一样。

我的情况与此类似;

require 'aws/s3'

class ProfileVideo < ActiveRecord::Base

  def self.cleanup

    # <snip> YAML load my config etc etc

    AWS::S3::Base.establish_connection!(
      :access_key_id     => @aws_config['aws_key'],
      :secret_access_key => @aws_config['aws_secret']
    )      

  end

  def self.another_method
    # I want to use AWS::S3 here without needing to establish connection again
  end

end

我还注意到,在我的课堂上,初始化无法执行——一个简单的“把“放在这里””什么也没做。考虑到这是一项 rake 任务,我可以将“这里”放在其他方法中。我不确定 rake 是否不像运行 ProfileVideo.new 那样初始化?

无论如何,提前谢谢。

4

1 回答 1

2

我特别不熟悉 S3 gem,但这里有几种方法可以解决这个问题。

如果您只是想让建立连接更容易,您可以在模型中创建一个方法,如下所示:

def open_s3
  return if @s3_opened
  AWS::S3::Base.establish_connection!(
    :access_key_id     => @aws_config['aws_key'],
    :secret_access_key => @aws_config['aws_secret']
  )
  @s3_opened = true
end

然后你可以open_s3在任何需要它的方法的顶部调用它,它只会打开一次。

您可以采取的另一条路线是将连接代码放在设置为在任何其他钩子之前触发的前钩子中(IIRC,您定义它们的顺序设置它们触发的顺序),然​​后进行调用。

无论哪种情况,我都建议不要将您的 AWS 密钥和密码放入您的代码中。相反,那些应该进入配置文件的配置文件会被您的版本控制系统忽略,并在部署时为远程系统生成。

于 2013-01-21T08:34:18.977 回答