In my project, I altered the registration form in Devise to add an :agree option via an accessor (user must accept terms of service to register, etc). If they don\'t agree, it d
I prefer to base these kinds of things on whether or not the record is new (which is the only time the user will be "signing up").
class User < ActiveRecord::Base
validates :agree, :term_agreement => TRUE, :if => :signing_up?
# Return true if the user is currently signing up
def signing_up?
new_record?
end
end
The key is to keep in mind that the value of :if
and :unless
is "a method, proc or string to call to determine if the validation should [or should not] occur"--so you're free to define methods on your model for this purpose.
I fixed this by configuring devise to update the password attributes directing if validation failed, but only if the password attributes are error free.
See my answer here:
Validation errors are triggered when I'm trying to reset password
So, you need to validate the acceptance of terms when the record is created?
class User < ActiveRecord::Base
validates :agree, :acceptance => true, :on => :create
end
:on => :create
will only perform that validation when the record is being created—much like Brandon's answer, but without redundant code.
This will also obviate the need for your controllers to worry about if a user is signed in or not.