我正在使用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
答案 0 :(得分:0)
找到答案。问题不在于validates_acceptance_of,而在于我如何保存数据。创建运算符时,还创建了一个与之绑定的用户,并且正在将该用户插入到数据库中。
这是因为虽然操作员正在回滚(因为它无效),但仍然创建了用户(因为它不在事务中)。
我通过使用nested_transactions解决了这个问题:
运营商模型:
...
User.transaction(:requires_new => true) do
create_user
raise ActiveRecord::Rollback unless self.valid?
end
...