我使用的是ruby 1.9.2-p180,rails 3.0.7。我使用了validates_acceptance_of,因为用户必须同意我们的条款和条件。我们没有对应的列,但我知道“如果数据库列不存在,terms_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发布于 2011-08-09 16:52:17
找到答案了。问题不在于validates_acceptance_of,而在于我保存数据的方式。当创建操作员时,还创建了绑定到该操作员的用户,并且该用户正被插入到数据库中。
这是因为尽管操作符正在回滚(因为它无效),但仍然创建了用户(因为它不在事务中)。
我使用nested_transactions解决了这个问题:
操作员模型:
...
User.transaction(:requires_new => true) do
create_user
raise ActiveRecord::Rollback unless self.valid?
end
...https://stackoverflow.com/questions/6991314
复制相似问题