ruby-on-rails - Rails - 在模型中动态定义实例方法

标签 ruby-on-rails ruby model dynamic instance-methods

我不确定这是否可以实现,但是这里...:)

让我们假设两个模型,一个Page 模型和一个Field 模型。 Page has_many :fieldsField 模型有两个属性::name, :value

我想要实现的是在 Page 模型中为每个返回 Field#valueField#name 动态定义实例方法。

因此,如果我的页面有一个名为“foobar”的字段,我会动态创建一个方法,如下所示:

def foobar
  fields.find_by_name("foobar").value
end

这能实现吗?如果是这样,请帮助?

交给 ruby​​ists...

最佳答案

您可以覆盖 method_missing 以实现您的目标:

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

关于ruby-on-rails - Rails - 在模型中动态定义实例方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3570457/

相关文章:

ruby - 网络上最活跃的 Ruby 论坛/博客是什么?

model-view-controller - MVC datatype.datetime 有值但不显示

c++ - 使用自定义 QSortFilterProxyModel 覆盖哪些函数

mysql - Rails 3 - ActiveRecord + MySQL 和 RANDOM 函数

ruby-on-rails - gem rMagick 未在 ubuntu 18.04 上安装

ruby-on-rails - 如何让 Capybara 在 Cucumber 功能中执行 DELETE 请求?

ruby-on-rails - 组合 2 个对象并排序 rails 5

ruby - 通过 Ruby Net::IMAP 收集邮件时如何最好地编码或清理电子邮件正文

ruby-on-rails - 混合 acts_as_tree(祖先 gem)、acts_as_list 和默认模型范围

javascript - Rails View 中的 Javascript 问题