1

Я занимаюсь метапрограммированием в Ruby. Я пишу библиотеку для мета-определения некоторых методов для меня, особенно в контроллере (автоматизируйте некоторые методы find_by, которые я должен написать для своих приложений).Как ActionController :: Base in Rails знает, какой класс является его моделью?

В настоящее время я генерирую эти методы, передавая имя модели для конкретного контроллера в свой метод метапрограммирования. Есть ли в контроллере метод, который равен, привязанный к модели 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)

Простой вопрос со сложным объяснением.

+0

Неужели 'self.class' не дает вам то, что вы ищете? – hwatkins

ответ

1

Контроллеры по умолчанию не привязаны к определенной модели. Вы можете иметь контроллер, играющий с несколькими разными моделями, или даже с контроллером, не использующим никакой модели вообще.

Если вы все еще хотите, чтобы ваш код работал автоматически в «классических» случаях, вы можете посмотреть имя контроллера и искать модель с тем же именем (в соответствии с соглашениями об именах рельсов).