开发者

validates_acceptance_of still saves the record

开发者 https://www.devze.com 2023-03-26 15:54 出处:网络
I am using ruby 1.9.2-p180, rails 3.0.7. I have used validates_acceptance_of since the user has to agree to our terms and conditions. We don\'t have a column for t开发者_如何学JAVAhis, but I understan

I am using ruby 1.9.2-p180, rails 3.0.7. I have used validates_acceptance_of since the user has to agree to our terms and conditions. We don't have a column for t开发者_如何学JAVAhis, but I understand that "If the database column does not exist, the terms_of_service attribute is entirely virtual. " from http://ar.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M000082

Anyway, I double checked this by smoke testing the app manually and I see from the logs that the record is still inserted into the db, which is weird because upon submitting the form, I am redirected back to the form with the error: "Must agree to terms and conditions"(which made me think it worked before)

Am I doing something wrong here?

_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

and in the model:

validates_acceptance_of :terms_and_conditions


Found the answer. The problem was not with validates_acceptance_of but rather with how I was saving the data. When an operator was created, a user was also created that was tied to it and it was this user that was being inserted into the db.

This happens because although the operator was being rolled back(because it wasn't valid) the user was still created(because it was not in a transaction).

I solved this by using nested_transactions:

operator model:

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

精彩评论

暂无评论...
验证码 换一张
取 消