3

良い解決策が見つからない奇妙なニーズがあります。

オブジェクト、ハッシュ、または配列のいずれかを渡すメソッドがあります。そして、渡すオブジェクト、ハッシュ、または配列の名前を取得できるようにしたいと考えています。

次に例を示します。

@user = User.find(5)

log_info(@user)

def log_info(obj)
  Rails.logger.debug(obj.to_s)
  Rails.logger.debug(obj.inspect)
end

次のようなログが記録されます。

@user
{"active"=>true, "address1"=>"something", "address2"=>"", "city"=>"somewhere"} 

これにより、これを行う必要がなくなります。

@user = User.find(5)

log_info("@user", @user)

def log_info(heading, obj)
  Rails.logger.debug(heading)
  Rails.logger.debug(obj.inspect)
end

これを達成する方法についてのアイデアはありますか?

4

2 に答える 2

2

ちょっとしたハッカーでそれを行うことができます - 私はここにこれを残しておきます:

class Reference
    def initialize(var_name, vars)
      @var_name = var_name
      @getter = eval "lambda { #{var_name} }", vars
    end
    def name 
      @var_name
    end
    def value
      @getter.call
    end
end
def log_info(ref)
  Rails.logger.debug(ref.name.to_s)
  Rails.logger.debug(ref.value.inspect)
end
def ref(&block)
  Reference.new(block.call, block.binding)
end
@user = "something";
log_info(ref{:@user}) # -> @user - "something"
于 2012-12-04T21:20:37.443 に答える
1

インスタンス変数のみを操作する必要がある場合は、次のようにすることができます。

def log_info(obj)
  heading = instance_variables.detect {|name| instance_variable_get(name).equal?(obj) }
  Rails.logger.debug(heading)
  Rails.logger.debug(obj.inspect)
end
于 2012-12-04T21:20:21.050 に答える