非用户定义输入的简单Rails验证问题

时间:2010-12-14 18:06:56

标签: ruby-on-rails

背景

  • 我在rails应用
  • 中使用 acts_as_list gem
  • 我的帖子表有一个位置
  • 位置在我的模型中的before_create回调中分配:

这是我的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吗?

1 个答案:

答案 0 :(得分:1)

第一个问题

before_validation :set_position, :on => :create

奖金问题。 你可能得到了大规模的分配(检查你的日志) 当您删除验证rails时,不会在:position上返回任何错误,因此它们会保存attr_accesible中的内容(可能是DB中的位置为空)