具有对象属性的Ruby对象

具有对象属性的Ruby对象,ruby,rake,ruby-on-rails-2,Ruby,Rake,Ruby On Rails 2,我有一个使用的类,在我的类中有几个使用gem的方法。我的问题是,与其在多个位置配置它,不如将其作为对象的属性 在PHP中,我们可以这样做 <?php class myClass { private $obj; public function __construct() { $this->obj = new Object(); } } ?> 然后我可以在myClass的任何地方使用$this->obj->method() 我很

我有一个使用的类,在我的类中有几个使用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
要求“aws/s3”
class ProfileVideo@aws_config['aws_key'],
:secret\u access\u key=>@aws\u config['aws\u secret']
)      
结束
def self.另一种方法
#我想在这里使用AWS::S3,而无需再次建立连接
结束
结束
我还注意到,在我的类中,initialize无法执行——一个简单的“puts“here”什么也不做。考虑到这是一个rake任务,我可以在其他方法中“放置”这里。我不确定rake是否不喜欢运行ProfileVideo。new会吗


无论如何,请提前感谢。

我对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
,它将只打开一次

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


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

Hi Seth,谢谢,但有一个简单的问题——创建这样的对象(Gem)——它在运行时是否会在我的对象(myClass)中保持不变?换句话说,我可以在myClass中运行S3 gem的方法而不需要重新创建它吗?(此外,配置文件位于配置目录中的.yml中,git会忽略该文件。)再次感谢。@Christian–再次查看gem页面上的示例,该连接似乎像ActiveRecord连接一样打开,并应保持打开状态,直到请求完成(即,直到页面返回给用户)。我没有S3帐户,所以我不能自己测试。