gpt4 book ai didi

ruby-on-rails - Rails 模块 : How to define instance methods inside a class method?

转载 作者:数据小太阳 更新时间:2023-10-29 07:32:23 25 4
gpt4 key购买 nike

我想创建一个名为 StatusesExtension 的模块,它定义了一个 has_statuses 方法。当一个类扩展 StatusesExtension 时,它将具有针对这些状态的验证、范围和访问器。这是模块:

module StatusesExtension
def has_statuses(*status_names)
validates :status, presence: true, inclusion: { in: status_names }

# Scopes
status_names.each do |status_name|
scope "#{status_name}", where(status: status_name)
end

# Accessors
status_names.each do |status_name|
define_method "#{status_name}?" do
status == status_name
end
end
end
end

下面是一个扩展这个模块的类的例子:

def Question < ActiveRecord::Base
extend StatusesExtension
has_statuses :unanswered, :answered, :ignored
end

我遇到的问题是,在定义范围时,实例方法(已回答?未回答?和忽略?)没有。例如:

> Question.answered
=> [#<Question id: 1, ...>]
> Question.answered.first.answered?
=> false # Should be true

如何使用模块在模块的单个类方法 (has_statuses) 的上下文中同时定义类方法(作用域、验证)和实例方法(访问器)?

谢谢!

最佳答案

正如评论所说,方法正在定义中,只是没有按预期工作。我怀疑这是因为您在方法中将字符串与符号进行比较(status_names 是一个符号数组,而 status 将是一个字符串)。尝试以下操作:

status_names.each do |status_name|
define_method "#{status_name}?" do
status == status_name.to_s
end
end

关于ruby-on-rails - Rails 模块 : How to define instance methods inside a class method?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16409919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com