如果我有一个ActiveRecord模型如下
class Foo < ActiveRecord::Base
validates_inclusion_of :value, :in => self.allowed_types
def self.allowed_types
# some code that returns an enumerable
end
end
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为在评估验证时尚未定义allowed_types方法.我能想到的所有修复基本上都围绕着将方法定义移到验证之上,以便在需要时可用.
我理解这可能更像是一个编码风格的问题而不是任何东西(我希望我的所有验证都在模型的顶部和底部的方法)但我觉得应该有一些解决方案,可能涉及懒惰的评估初始模型加载?
我想做什么甚至可能?我应该只是定义验证上方的方法,还是有更好的验证解决方案来实现我想要的.
我正在尝试定义一些帮助函数,以便从emacs中快速跳转到不同的项目.我开始定义一个宏如下
(defmacro project-alias (name path)
`(defun ,name ()
(interactive)
(cd ,path)))
Run Code Online (Sandbox Code Playgroud)
这很好用我也(project-alias foo "~/bar")没问题.当我尝试将此宏应用于元组列表时,问题就出现了.
(setq projects '((foo . "~/foo")
(bar . "~/bar")))
(dolist (p projects)
(project-alias (car p) (cdr p)))
Run Code Online (Sandbox Code Playgroud)
上面的代码错误
Debugger entered--Lisp error: (wrong-type-argument symbolp (car p))
defalias((car p) (lambda nil (interactive) (cd (cdr p))))
Run Code Online (Sandbox Code Playgroud)
我已经尝试将第一个参数作为字符串传递并调用intern以获得符号表示而没有任何乐趣,我也尝试定义我的宏来接受字符串形式,这也不起作用
我究竟做错了什么?