2013-12-23 3 views
7

Ich würde gerne Klassenmethode mit Modul Nr. Betreffen (https://github.com/37signals/concerning - Teil von Rails 4.1). Dadurch würde ich Module, die von einer einzelnen Klasse verwendet werden, wieder in die Klasse verschieben.Kann ich Klassenmethoden mit Modul # definieren?

Es scheint jedoch, dass ich Klassenmethoden nicht definieren kann. Vor diesem Hintergrund:

class User < ActiveRecord::Base 
    attr_accessible :name 

    concerning :Programmers do 
    module ClassMethods 
     def programmer? 
     true 
     end 
    end 
    end 

    module Managers 
    extend ActiveSupport::Concern 

    module ClassMethods 
     def manager? 
     true 
     end 
    end 
    end 

    include Managers 
end 

Ich würde erwarten, diese beiden zu arbeiten:

User.manager? 
User.programmer? 

Aber die zweite hebt

NoMethodError: undefined method `programmer?' for #<Class:0x007f9641beafd0> 

Wie kann ich Klasse Methoden Modul # betreffend definieren?

+0

FWIW, Beispielprojekt: https://github.com/johnnaegle/concerning-example –

+1

https://github.com/37signals/concerning/issues/1 –

+0

Dies ist in Rails behoben und betrifft jetzt. –

Antwort

7

https://github.com/basecamp/concerning/pull/2 fixiert diese:

class User < ActiveRecord::Base 
    concerning :Programmers do 
    class_methods do 
     def im_a_class_method 
     puts "Yes!" 
     end 
    end 
    end 
end 

Console:

> User.im_a_class_method 
Yes! 
5

Versuchen Sie stattdessen:

concerning :Programmers do 
    included do 
    def self.programmer? 
     true 
    end 
    end 
end 
+0

Das funktioniert, aber es ist nicht annähernd so sauber wie ich es gerne hätte - die nahtlose Moduldefinition war wirklich ansprechend. –

+0

Einverstanden - das Feature scheint noch nicht vollständig gebacken zu sein. – Rob

2

Schnell Abhilfe:

concerning :MeaningOfLife do 
    included { extend ClassMethods } 

    module ClassMethods 
     ... 
    end 
Verwandte Themen