Rails中的ActionController :: Base如何知道它的模型是什么类?

时间:2013-03-18 14:31:41

标签: ruby-on-rails ruby-on-rails-3 metaprogramming polling actioncontroller

我在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(:模型)

一个带有复杂解释的简单问题。

1 个答案:

答案 0 :(得分:1)

默认情况下,控制器不依赖于特定模型。你可以让一个控制器玩几种不同的模型,甚至一个控制器都不使用任何模型。

如果您仍希望代码在“经典”情况下自动运行,您可以查看控制器的名称,并查找具有相同名称的模型(遵循rails命名约定)。