如何动态创建带有参数烘焙的Ruby方法?

时间:2013-02-13 09:36:14

标签: ruby class methods module metaprogramming

当动态创建一个类方法时,有没有办法在创建时烘焙一些已知的参数?

我为自己创建了一个模块,当我创建模型时,它会从给定的:slug生成:title属性。 https://gist.github.com/firedev/4943289

但是我想重构这一部分:

def create_slug(title_attr, slug_attr, &block) # generated method
  self.send(slug_attr) # I have to pass slug_attr from outside
  ...
end

所以我可以摆脱所有的参数:

self.send :after_initialize do
  create_slug(title_attr, slug_attr, &block) # I pass attributes from here
end

并在创建的方法中添加参数:

def create_slug # this method is generated automatically
  self.send(:slug) # I want :slug to be baked in 
  ...
end

self.send :after_initialize, :create_slug # no attributes

1 个答案:

答案 0 :(得分:0)

看一下这段代码:https://github.com/oleander/to_param-rb/blob/master/lib/to_param/base.rb

我认为它符合您的要求。

<强>用法:

class User < ActiveRecord::Base
  to_param :name
end

User.create(name: "Linus").to_param # => "1-linus"