2012-12-08 2 views
1

가 현재 내 이벤트 모델은 내가</p> <pre><code>class Event < ActiveRecord::Base include Scheduler </code></pre> <p>내가이에 cattr_accessor_with_default 방법을 이동할 수 없습니다 보인다 스케줄러 모듈을 정의로

class Event < ActiveRecord::Base 

    def self.cattr_accessor_with_default(name, value = nil) 
    cattr_accessor name 
    self.send("#{name}=", value) if value 
    end 
    cattr_accessor_with_default :fixed_start_end_times, false 
    ... 

에이 모듈에 cattr_accessor_with_default 클래스 메서드를 삽입 할 수 있습니다 스케줄러 모듈

module Scheduler 
    def self.included(base) 
    base.send :include, InstanceMethods 
    base.extend ClassMethods 
    end 

    module ClassMethods 
    def cattr_accessor_with_default(name, value = nil) 
     cattr_accessor name 
     self.send("#{name}=", value) if value 
    end 
    cattr_accessor_with_default :fixed_start_end_times, false 
    ... 

오류 발생 : 정의되지 않은 메서드`cattr_accessor_with_default '스케줄러 :: ClassMethods에 대한 : 모듈 (NoMethodError)

내가 더 나은 Rails3 방법을 사용하는 것도 시도

module Scheduler 
    def self.included(base) 
    base.send :include, InstanceMethods 
    base.extend ClassMethods 
    end 
    module ClassMethods 
    class_attribute :fixed_start_end_times 
    self.fixed_start_end_times = false 

같은 오류 정의되지 않은 메서드`class_attribute'에 대한 스케줄러 :: ClassMethods : 모듈

답변

2

나는 cattr_accessor_with_default을 틀린 장소에 넣었다고 생각합니다. 다음 코드를 입력하십시오 :

module Scheduler 
    def self.included(base) 
    base.send :include, InstanceMethods 
    base.extend ClassMethods 
    base.class_eval do 
     cattr_accessor_with_default :fixed_start_end_times, false 
    end 
    end 

    module ClassMethods 
    def cattr_accessor_with_default(name, value = nil) 
     cattr_accessor name 
     self.send("#{name}=", value) if value 
    end 
    ... 

이렇게하면 cattr_accessor_with_default이 포함되는 클래스로 전송됩니다. class Eventcattr_accessor_with_default이 클래스 메서드로 해당 클래스에 추가되었습니다.

+0

덕분에 ... 갈 알고, 내가 이동하는 경우에도 더 좋은 기록에 Rails3 구현 – erwin

0

먼저 내가 만든 :

#lib/scheduler.rb 

module Scheduler 

    extend ActiveSupport::Concern 

    included do 
    class_attribute :fixed_start_end_times 
    self.fixed_start_end_times = false 
    end 

    # adding instance methods here 
    def foo 
    "foo" 
    end 

    # adding static(class) methods here 
    module ClassMethods 

     def starting_on(start_date) 
     where("CAST(starts_at AS TIME) = ?", Event.db_time(start_date)) 
     end 
    end 
end 

# including the extension 
ActiveRecord::Base.send(:include, Scheduler) 

은 그 때 나는 추가 :

in #config/initializers/scheduler.rb 
require "scheduler" 

등함으로써 해결할 수 ...