1

現在、私はイベントモデルに持っています

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
   ...

Scheduler モジュールを定義したとき

 class Event < ActiveRecord::Base
    include Scheduler

cattr_accessor_with_default メソッドをこの Scheduler モジュールに移動できないようです

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
    ...

エラーの発生: Scheduler::ClassMethods:Module の未定義メソッド `cattr_accessor_with_default' (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

Scheduler::ClassMethods:Module の未定義メソッド「class_attribute」と同じエラー

4

2 に答える 2

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

于 2012-12-08T14:05:50.640 に答える
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"

ほら...

于 2012-12-08T14:14:57.137 に答える