1

저는 Ruby에서 약간의 메타 프로그래밍을하고 있습니다. 나는 meta-define을위한 라이브러리를 쓰고 있는데, 특별히 컨트롤러에서 (필자의 어플리케이션을 위해 작성해야하는 find_by 메소드를 자동화한다.) 몇 가지 메소드를 정의한다.레일스에서 ​​ActionController :: Base는 모델의 클래스를 어떻게 알 수 있습니까?

현재 특정 컨트롤러의 모델 이름을 메타 프로그래밍 방식으로 전달해야 이러한 메소드가 생성됩니다. 이 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 

에 계획 빈약 한 예를하고, 어떻게 그렇게 내가 통과하지 않아도 만들 수 도박꾼 수업을 내 방법으로? 모델을 직접 호출 할 수있는 일종의 메소드 나 속성이 있습니까? 예. self.send (: model)

복잡한 설명이있는 간단한 질문입니다.

+0

'self.class'는 당신이 찾고있는 것을주지 못합니까? – hwatkins

답변

1

컨트롤러는 기본적으로 특정 모델에 종속되어 있지 않습니다. 컨트롤러를 여러 모델로 재생하거나 모델을 전혀 사용하지 않은 컨트롤러로 재생할 수 있습니다.

"고전적인"경우에 코드가 자동으로 작동하도록하려면 컨트롤러의 이름을보고 이름이 같은 모델을 찾아야합니다 (레일 명명 규칙에 따라).