ruby-on-rails - Ruby:基于模型属性的元编程方法

标签 ruby-on-rails ruby ruby-on-rails-4 metaprogramming

我试图根据类的 order 属性中的值向类公开一些方法,这些方法可能类似于 ['top', 'bottom', 'right', 'lower-right'] .

首先,我的类从该数组中删除任何响应空白的内容,如下所示:

def order
  order.split(' ').delete_if do |o|
    send(o).blank? if respond_to? o
  end
end

之后,我想“公开”top(例如)作为该类的方法。我在 initialize 方法中尝试过类似的方法:

order.each do |o|
  V1_ATTRIBUTES << o.to_sym
  define_method(o) do |a|
    send(a).blank? ? '' : send(a)
  end
end

但是当类未实例化时,o 未定义,a:

<NameError: undefined local variable or method `o' for #<Class:#<APIDocument:0x007fb8123609f8>>>

有人有更好的方法来获得这个结果吗?

注意:我知道允许用户编写实例方法名称并不是一个好的做法,但在这种情况下,安全性和破坏不是问题。

最佳答案

您可以定义单例方法(每个对象的方法)。

def order
  orders.split(' ').map{|o| send(o)}.compact.each do |o| 
    singleton_class.send(:define_method, o) do
      send(o).to_s
    end
  end
end

但是正如您所看到的,这只会弄乱您的代码。因此,不要滥用元编程,而是明智地使用它。

关于ruby-on-rails - Ruby:基于模型属性的元编程方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38256833/

相关文章:

ruby-on-rails - Rails 4 assets manifest.json 最近的摘要

ruby - 如何将curl 的输出读入ruby 变量?

css - Bootstrap 类不适用于选择

ruby-on-rails - Ruby on Rails,在输入帖子 ID 时呈现 404

Java + rails : Invoking some Java code from within a rails app

javascript - link_to 不替换 div 内容

sql - 不同的加入 Rails

ruby-on-rails - rake routes 是否显示了我所有的应用程序可用路线,或者在 ruby​​ on rails 中缺少一些路线?

ruby-on-rails - Rails 声誉系统

ruby - Rails 4 ActiveModel::OrdersController#create 中的 MissingAttributeError