Domanda

I'm doing a bit of metaprogramming in Ruby. I'm writing a library to meta-define some methods for me, specifically in the controller (automate some find_by methods that I have to write for my applications).

Currently I generate these methods by having to pass the name of the model for a particular controller into my meta-programming method. Is there a method in a controller that is tied to an ActiveRecord model.

So, here is a poor example

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

So, to use this method, I plan to

GamblerController < ApplicationController
  write_some_methods_for Gambler
end

Again, how could I make it so I don't have to pass the Gambler class to my method? Is there some sort of method or attribute that I could just call the model directly? eg. self.send(:model)

A simple question with a complex explanation.

È stato utile?

Soluzione

Controllers are not tied to a particular model by default. You can have a controller playing with several different models, or even a controller using no model at all.

If you still want your code to work automatically in "classic" cases, you could look at the controller's name, and look for a model with the same name (following rails naming conventions).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top