ruby 为什么我不能在define_method的“module”块中使用方法调用?

sd2nnvve  于 2023-10-17  发布在  Ruby
关注(0)|答案(1)|浏览(110)

我有一个模型类attr_reader -type_slugs(返回一个字符串数组),我想用它来生成几个方法。
举例来说:

  1. module Orders
  2. module Extensions
  3. module Order
  4. module TypeCheckable
  5. extend ::ActiveSupport::Concern
  6. ::Orders::Config.type_slugs.each do |type|
  7. define_method("#{type}_order_type?") { order_type == type }
  8. end
  9. end
  10. end
  11. end
  12. end

但它给了我NoMethodError: undefined methodtype_slugs' for Orders::Config:Module`
如果我使用任何模型方法,也会发生同样的错误,比如:

  1. some_method_defined_in_model.each do |type|
  2. define_method("#{type}_order_type?") { order_type == type }
  3. end

但是如果我用一个单词数组

  1. %w(message product another).each do |type|
  2. define_method("#{type}_order_type?") { order_type == type }
  3. end

在这种情况下,是否可以使用Orders::Config.type_slugs?若否,原因为何?

xzlaal3s

xzlaal3s1#

根据您提供的信息,模块Orders::Config没有type_slugs方法
如果你想让你的代码工作,你需要定义它,像这样:

  1. module Orders
  2. module Config
  3. def self.type_slugs
  4. %w[message product another]
  5. end
  6. end
  7. end

或者,如果该列表不动态更改:

  1. module Orders
  2. module Config
  3. TYPE_SLUGS = %w[message product another].freeze
  4. end
  5. end

在这种情况下,将::Orders::Config.type_slugs更改为::Orders::Config::TYPE_SLUGS
当使用Rails concerns时,应该为示例方法使用included

  1. module Orders
  2. module Extensions
  3. module Order
  4. module TypeCheckable
  5. extend ::ActiveSupport::Concern
  6. included do
  7. ::Orders::Config::TYPE_SLUGS.each do |type|
  8. define_method("#{type}_order_type?") { order_type == type }
  9. end
  10. end
  11. end
  12. end
  13. end
  14. end

之后,您可以在模型中使用它

  1. class SuperOrder < ApplicationRecord
  2. include Orders::Extensions::Order::TypeCheckable
  3. end
  4. class BestOrder < ApplicationRecord
  5. include Orders::Extensions::Order::TypeCheckable
  6. end

并像这样调用方法

  1. SuperOrder.new.product_order_type? # compare super order type with "product"
  2. BestOrder.new.message_order_type? # compare best order type with "message"
展开查看全部

相关问题