Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails—在模型中动态定义实例方法_Ruby On Rails_Ruby_Model_Dynamic_Instance Methods - Fatal编程技术网

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会这样做,但您通常不会在运行时更改列,我猜您会在运行时更改字段。谢谢,这是一个很大的帮助