Ruby on rails Rails—在模型中动态定义实例方法
我甚至不确定这是否能实现,但接下来是……:) 让我们假设两个模型,一个Ruby on rails Rails—在模型中动态定义实例方法,ruby-on-rails,ruby,model,dynamic,instance-methods,Ruby On Rails,Ruby,Model,Dynamic,Instance Methods,我甚至不确定这是否能实现,但接下来是……:) 让我们假设两个模型,一个页面模型和一个字段模型。页面有许多:字段,而字段模型有两个属性::名称,:值 我想要实现的是在页面模型中为每个字段#name动态定义实例方法,返回字段#值 因此,如果我的页面有一个名为“foobar”的字段,我会动态创建一个如下方法: def foobar fields.find_by_name("foobar").value end 这能实现吗?如果是,请帮忙 交给红宝石专家…您可以覆盖缺少的方法来实现您的目标: de
页面
模型和一个字段
模型。页面有许多:字段
,而字段
模型有两个属性::名称,:值
我想要实现的是在页面
模型中为每个字段#name
动态定义实例方法,返回字段#值
因此,如果我的页面有一个名为“foobar”的字段,我会动态创建一个如下方法:
def foobar
fields.find_by_name("foobar").value
end
这能实现吗?如果是,请帮忙
交给红宝石专家…您可以覆盖缺少的方法来实现您的目标:
def method_missing(method, *args, &block)
super
rescue NoMethodError => e
field = fields.find_by_name(method)
raise e unless field
field.value
end
可能最好在动态方法中添加前缀或后缀,例如:
def method_missing(method, *args, &block)
if method.starts_with?('value_of_')
name = method.sub('value_of_', '')
field = fields.find_by_name(method)
field && field.value
else
super
end
end
把它叫做:
page.value_of_foobar
Rails中的模型是否覆盖缺少的方法?如果不是的话,你可以自己重写它,用这种方式定义方法。呃,捕获并重新提升,看起来不太好。为什么不颠倒顺序呢?查找字段(如果存在),返回值,否则调用super并继续使用缺少链的方法。我看到method missing的唯一缺点是不能将值命名为已定义的方法。您可以向动态方法添加前缀或后缀。那么它就不会有这样的副作用了。你可以使用methodmissing的一个很好的模式是:-当methodmissing被调用时,动态地将该方法添加到被调用的对象中,然后调用该方法。从那时起,对象拥有该方法,因此避免了对方法的其他调用丢失。ActiveRecord会这样做,但您通常不会在运行时更改列,我猜您会在运行时更改字段。谢谢,这是一个很大的帮助