我有一个奇怪的需要,我找不到一个好的解决方案。
我有一个方法可以将对象,散列或数组传递给。我希望能够获得我传递的那个对象,哈希或数组的名称。
以下是一个例子:
@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
关于如何实现这一目标的任何想法?
答案 0 :(得分:2)
你可以用一点点hackery做到这一点 - 我会把它留在这里:
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"
答案 1 :(得分: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