validates_acceptance_of仍保存记录

时间:2011-08-09 04:21:35

标签: ruby-on-rails-3 validation activerecord

我正在使用ruby 1.9.2-p180,rails 3.0.7。我使用了validates_acceptance_of,因为用户必须同意我们的条款和条件。我们没有这个列,但我理解“如果数据库列不存在,则条件_of_service属性完全是虚拟的。”来自http://ar.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M000082

无论如何,我通过手动对应用程序进行烟雾测试来仔细检查这个,我从日志中看到记录仍然插入到数据库中,这很奇怪,因为在提交表单时,我被重定向回到表单中并出现错误:“必须同意条款和条件”(这使我认为它之前有效)

我在这里做错了吗?

_form.haml:

%label.checkbox-label{:for => "operator_terms_and_conditions"}
  = f.check_box :terms_and_conditions
  I agree to 
  = link_to "Terms and Conditions", operator_terms_path, :target => "_blank"

operators_controller:

def create
  user_params = params[:operator][:user]
  user_params.merge!(:login => user_params[:email])
  @password = params[:operator][:user][:password]

  Operator.transaction do # don't save User if operator is invalid
    @operator = Operator.create(params[:operator])
  end

  respond_to do |format|
    unless @operator.new_record?
      UserMailer.operator_confirmation_email(@operator, @password).deliver
      UserMailer.operator_registration_admin_notification_email(@operator).deliver

      UserSession.create(@operator.user)
      format.html {redirect_to new_operator_aircraft_path}
    else
      format.html { render :action => "new" }
    end
  end

end

并在模型中:

validates_acceptance_of :terms_and_conditions

1 个答案:

答案 0 :(得分:0)

找到答案。问题不在于validates_acceptance_of,而在于我如何保存数据。创建运算符时,还创建了一个与之绑定的用户,并且正在将该用户插入到数据库中。

这是因为虽然操作员正在回滚(因为它无效),但仍然创建了用户(因为它不在事务中)。

我通过使用nested_transactions解决了这个问题:

运营商模型:

...
User.transaction(:requires_new => true) do
  create_user
  raise ActiveRecord::Rollback unless self.valid?
end
...