背景
这是我的Post模型的代码:
class Post < ActiveRecord::Base
acts_as_list
before_create :set_position
attr_accessible :title, :description, :category_id
validates :position, :presence => true, :uniqueness => true
protected
def set_position
self.position = Post.all.size + 1
end
end
我的问题: 我不希望用户能够设置位置,因此我从Post表单中删除了position字段。当我提交新帖子时,验证失败,我被告知该位置不能为空。
我意识到我的验证失败了,因为用户没有自己输入位置,但是我已经在before_filter中设置了位置,那么如何在执行验证时让rails使用该信息?
奖金问题
当我删除验证时,表单提交,但我想知道为什么这有效,因为我没有将位置传递给attr_accessible?我将许多其他符号传递给它:attr_accessible :title, :description, :category_id
但我没有通过:position
。那里可能有任何问题吗?位置应该是attr_protected吗?
答案 0 :(得分:1)
第一个问题
before_validation :set_position, :on => :create
奖金问题。
你可能得到了大规模的分配(检查你的日志)
当您删除验证rails时,不会在:position
上返回任何错误,因此它们会保存attr_accesible
中的内容(可能是DB中的位置为空)