在after_save回调rails中创建动态实例方法

时间:2016-06-04 07:15:30

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

我在名为pure (+) <*> [1,2,3] <*> [4,5,6] -- [5,6,7,6,7,8,7,8,9] pure (+) <*> ZipList [1,2,3] <*> ZipList [4,5,6] -- ZipList [5,7,9] 的模型中有一个after_save回调,我在其他名为Field的模型上创建了动态实例方法,但是代码无效,我无法找出它的错误,因为逻辑非常简单。请帮助。

User

然后我在class field < ActiveRecord::Base after_create :create_user_methods private def create_user_methods User.class_eval do define_method(self.name) do #some code end define_method(self.name + "=") do #some code end end end end 中创建Field实例,就像这样

rails console

然后在User类实例上调用该方法,如此

  Field.create(name: "test_method")

但它引发了错误

未定义的方法 User.new.test_method for ....

1 个答案:

答案 0 :(得分:0)

我得到了修复,我无法在self块中使用class_eval,因为它的值是用户模型而不是Field类对象,因此修复是:

class field < ActiveRecord::Base

  after_create :create_user_methods

  private

    def create_user_methods

      name = self.name # here self points to field object

      User.class_eval do
        define_method(name) do
          #some code
        end

        define_method(name + "=") do
          #some code
        end
      end
    end
  end