CTimestampBehavior导致save()的失败

model里面:




public function behaviors()

{

        return array(

            'CTimestampBehavior' => array(

                'class' => 'zii.behaviors.CTimestampBehavior',

                'createAttribute' => 'create_time',

                'updateAttribute' => 'update_time',

            )

        );

}



[color="#FF0000"]注意我把create_time 和update_time写到rules的required里面[/color]





public function rules()

{

	return array(

            array('value, points, create_time, update_time', 'required'),

		);

	}



这个时候,如果是一条新记录




$test = new Test;

$test->value = 0;

$test->points = 0;



如果是用下面的语句,application.log也没有说有错误,输出为 false




echo $test->save();



但如果是直接insert()的话, 就输出为true




echo $test->insert();



如果把create_time,update_time从rules()中去掉,就save()和insert()都没有问题。

是bug来的吗?还是我哪里没有设置好呢?

补充一下,就是[color="#FF0000"]model我是用yiic生成的[/color],就是说,create_time和update_time,required,是生成出来的,如果要用上CTimestampBehavior就会出现这样的bug,要手工把生成的create_time和update_time去掉

这和CTimestampBehavior无关。你应该把create_time, update_time从rules里去掉,不然validation通不过(还没到CTimestampBehavior执行)。从逻辑上讲,create_time, update_time也不应该在rules里,因为它们不是用户输入的。

对,但是也反映了一个问题,就是yiic生成的代码不是绝对可靠的~应该要改进yiic,或者是validation,检测CTimestampbehavior等的存在,排除create_time是required的

是的。在生成的rules()里就有这样一条警告信息:NOTE: you should only define rules for those attributes that will receive user inputs.

我之前也碰到这个问题,后来想应该保留model的rules,改成用beforeValdate事件来操作;

要求别太苛刻了,就是ror也不可能用SHELL生成就是你想要的东西。

如果那样的,搞程序的准备都下岗吧。

能做到现在的状态已经很不错了,这是免费的。