【发布时间】:2013-03-18 14:31:40
【问题描述】:
我正在使用 Ruby 进行一些元编程。我正在编写一个库来为我定义一些方法,特别是在控制器中(自动化一些我必须为我的应用程序编写的 find_by 方法)。
目前,我通过将特定控制器的模型名称传递到我的元编程方法中来生成这些方法。控制器中是否存在与 ActiveRecord 模型绑定的方法。
所以,这是一个糟糕的例子
module AwesomeGem
module ClassMethods
def write_some_methods_for(model)
raise "Class #{model.class} does not inherit ActiveRecord::Base" unless model < ActiveRecord::Base
define_method "money_remaining" do |id=nil|
moolah = id ? model.find(id).money : model.find(params[:id]).money
render text: moolah
end
define_method "money_remaining_poller" do |id=nil|
obj = id ? model.find(id) : model.find(params[:id])
# composes some ajax
render js: moneyjs
moneyjs
end
end
end
end
所以,要使用这种方法,我打算
GamblerController < ApplicationController
write_some_methods_for Gambler
end
同样,我怎样才能做到这样我就不必将 Gambler 类传递给我的方法?是否有某种方法或属性可以直接调用模型?例如。 self.send(:model)
一个简单的问题,一个复杂的解释。
【问题讨论】:
-
self.class没有给你想要的东西吗?
标签: ruby-on-rails ruby-on-rails-3 metaprogramming polling actioncontroller