以前始终以为array('name','safe'),这个验证器的含义是,过滤name变量为安全的,比如addslashes之类的,但,这是错误的想法。
后来发现在gii中自动生成的验证器有时候带有safe 有时候不带有。
经过查看了英文文档和一些资料之后,终于明白,safe这个验证器是在用户输入的所有变量添加完验证器后,对那些还没有验证器的指定为safe。
因为Yii默认用户输入的每个变量都是不安全的,所以你需要指定剩下没经过验证器的变量为safe,这时$model->attributes = $_POST['form-data']才可以正常批量复制。
举个例子,用户提交的表单含有 name,gender,age
你的验证器是
array('age', 'integerOnly'=>true),
array('gender','in'=>array('男','女')),
但这样的话你漏掉了name进行验证,Yii认为这个数据你没有验证,所以它不能被批量复制。
于是你确定name用户不会恶意利用,便添加array('name','safe'),
ok,这样每个变量都经过了验证,于是,works well。