0

AWS S3 gemを使用するクラスがあり、 gemを使用するいくつかのメソッドがクラスにあります。私の問題は、複数の場所で構成するのではなく、オブジェクトのプロパティにしたいということです。

PHPでは、これを行います。

<?php
  class myClass {

    private $obj;

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

そして、myClassのどこでも$ this-> obj-> method()を使用できます。

私はルビーでの仕事に似るようになるのに苦労しています。

私のシナリオはこれに似ています。

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が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、一度だけ開きます。

別の方法として、接続コードを before フック セットに配置して、他のフック (IIRC、定義した順序によって、それらが起動する順序が設定されます) の前に起動してから、呼び出しを行うこともできます。

どちらの場合でも、AWS キーとシークレットをコードに入れないようお勧めします。代わりに、これらはバージョン管理システムによって無視され、リモート システムのデプロイ時に生成される構成ファイルに入れられる必要があります。

于 2013-01-21T08:34:18.977 に答える