ruby-on-rails - 我不想通过 alias_method 修改的模型类的未定义方法
问题描述
我试图路径 ActiveRecord 模型验证 -
require_dependency "issue"
module IssuePath
def self.included(base) # :nodoc:
base.send(:include, InstanceMethods)
base.class_eval do
alias_method :strict_validate_issue, :validate_issue
alias_method :validate_issue, :unstrict_validate_issue
end
end
module ClassMethods
end
module InstanceMethods
def strict_validate_issue
if !due_date
errors.add :due_date, :due_date_empty
end
unstrict_validate_issue
end
end
end
Issue.send :include, IssuePath
但它抛出了一个错误 NameError: undefined method unstrict_validate_issue' for class
Issue (call 'Issue.connection' to建立连接)'。
解决方案
而不是strict_validate_issue
定义unstrict_validate_issue
方法并strict_validate_issue
在其中调用。
require_dependency "issue"
module IssuePath
def self.included(base) # :nodoc:
base.send(:include, InstanceMethods)
base.class_eval do
alias_method :strict_validate_issue, :validate_issue
alias_method :validate_issue, :unstrict_validate_issue
end
end
module ClassMethods
end
module InstanceMethods
def unstrict_validate_issue
if due_date.blank?
errors.add :due_date, :due_date_empty
end
strict_validate_issue
end
end
end
Issue.send :include, IssuePath
你甚至可以让它更短:
require_dependency "issue"
module IssuePath
extend ActiveSupport::Concern
included do
alias_method :strict_validate_issue, :validate_issue
alias_method :validate_issue, :unstrict_validate_issue
end
def unstrict_validate_issue
if due_date.blank?
errors.add :due_date, :due_date_empty
end
strict_validate_issue
end
end
Issue.send :include, IssuePath
推荐阅读
- c# - 当表的列多于类时使用 Dapper
- python-3.x - 使用 Primavera 集成 API 和 python 脚本访问 Primavera 数据
- c - 通用库依赖项?
- java - 为什么尝试上传大视频时,app engine gcloud 会抛出错误 413 entity too large?
- c# - 显示向左滚动固定 n 个点的大小与时间的 .Net 快速线图的最快方法是什么?
- python - 实例属性在python进程中丢失
- python - 更改相关矩阵 pandas df 格式以保存在数据库中
- git - 复制没有 .git 目录的存储库时,也会复制 Git 历史记录
- c++ - C++ istream 永远运行
- python - 如何有效地获取python列表列表中项目的计数