当我一直遇到(编辑过的)堆栈级别太深错误时,我试图编写我的第一个method_missing
覆盖。主要罪魁祸首似乎是试图利用实例属性。例如,如果'self'是User类的一个实例,那么检查类似的东西:
def method_missing(name)
if self.name
# do stuff
end
end
会出现故障。我花了很长时间在这上面,但最终放弃了。必须有一些我不理解访问它的东西。
道歉,安德鲁是对的,我的Stack Level太深了。考虑到这一点,访问实例属性值的适当方式(如果有的话)是什么?
答案 0 :(得分:1)
您可以潜在通过确保self.name
确实存在来纠正此问题:
def method_missing(name)
if self.respond_to?(:name) && self.name
# do stuff
end
end
请注意,如果您的类继承自任何Railsy(例如ActiveRecord::Base
),则可能无法,因为它会覆盖respond_to?
。
如果 在Railsy类中,您的方法丢失应该调用super
,以免丢失很多“神奇”的ActiveRecord方法(可能包括self.name
}本身):
def method_missing(name, *args, &block)
if name_is_something_i_should_handle_here
# do your stuff
else
super(name, *args, block) # call parent's method_missing
end
end
显然你应该用适当的逻辑替换name_is_something_i_should_handle_here
。
您可能还希望考虑使用dynamic method creation instead of method_missing
。