2010-05-28 67 views

回答

2

我想像你可以检查调用堆栈,但这正是型号是而不是:他们现在应该没有关于控制器。

检查堆栈:

if caller.grep /create/ 
    # do something 
elsif caller.grep /update/ 
    #do something else 
end 

应该做的伎俩。

+0

这是一个特例。有时你需要看看它来自何种方法。例如在验证方法中有:on =>:create symbol – djburdick 2010-05-28 00:47:06

+0

在这种情况下,只需使用'caller'方法返回一个名为方法名称的数组。 – 2010-05-28 15:22:37

+0

一方面很高兴知道这样的事情是可能的。但是这对我来说就像@Jakub所说的那样错误:这不是模型的目的。模型可以知道你是在创建一个新的对象还是在更新一个现有的对象。如果有需要的话,我会添加一个参数到我的初始化或其他东西。为了让模型尽可能无知和分离(更不用说可测试:你将如何测试这种行为?)。 – nathanvda 2010-05-28 19:06:28

2

只需将create标志传递给模型方法,或者在模型中创建两种不同的方法并从控制器调用相应的方法。否则,你会在控制器和模型之间创建一个相当不愉快的依赖关系。如您所述,验证方法需要一个参数来指定它们何时运行。

1

里面你的模型,你可以问/知道,如果你正在处理的记录是一个新的记录,或不

p = Post.new 
p.new_record? => true 
p = Post.first 
p.new_record? => false 

也许可以帮助你够了吗?

否则,在模型中,您可以添加callbacks,例如,仅在保存新记录之前调用的before_create。为保持模型精简,并且应该有很多回调,可以将它们分组在observer之内。

希望这会有所帮助。

相关问题