代码之家  ›  专栏  ›  技术社区  ›  vk26

Rails:使用模型中的常量将实例方法定义为关注点

  •  1
  • vk26  · 技术社区  · 7 年前

    我想使用模型中的常量动态地将实例方法声明为关注点。

    class Item < ApplicationRecord
      STATES = %w(active disabled).freeze
      include StatesHelper
    end
    
    module StatesHelper
      extend ActiveSupport::Concern
    
      # instance methods
      self.class::STATES.each do |state|
        define_method "#{state}?" do
          self.state == state
        end
      end
    end
    

    但我错了:

    名称错误:未初始化的常量statesheller::states

    但如果我在定义的方法中使用常量,它会起作用:

    module StatesHelper
      extend ActiveSupport::Concern
    
      # instance methods
      def some_method
        puts self.class::STATES # => ["active", "disabled"]
      end
    end
    

    在我的例子中,如何使用模型中的常量?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Sergio Tulentsev    7 年前

    你可以用 self.included 钩子在包含时获取对包含类的引用。

    module StatesHelper
      extend ActiveSupport::Concern
    
      def self.included(base)
        base::STATES.each do |state|
          define_method "#{state}?" do
            self.state == state
          end
        end
      end
    end
    
    class Item
      STATES = %w(active disabled).freeze
      include StatesHelper
    end
    
    item = Item.new
    item.respond_to?(:active?) # => true
    item.respond_to?(:disabled?) # => true