ruby-on-rails – Rails模块:如何在类方法中定义实例方法?
发布时间:2020-12-17 02:34:25 所属栏目:百科 来源:网络整理
导读:我想创建一个名为StatusesExtension的模块,它定义了一个has_statuses方法.当一个类扩展了StatusesExtension时,它将具有针对这些状态的验证,范围和访问器.这是模块: module StatusesExtension def has_statuses(*status_names) validates :status,presence:
我想创建一个名为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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |