Question

First, excuse my poor english, I'm french... it's tricky to explain my problem !

I have a model User model in a Rails application:

class User < ActiveRecord::Base

  attr_accessible :email, :gender, :lastname, :firstname    

end

And a BackUser model that inherit from User:

class BackUser < User
  # Class for Backoffice User
  devise :database_authenticatable, 
          :rememberable, 
          :trackable, 
          :lockable, 
          :invitable, 
          :confirmable,
          :validatable,
          :validate_on_invite => true

  attr_accessible :password, :password_confirmation, :remember_me, :active, :role

  validates :role, presence: true,
                  inclusion: ["admin", "normal"]

  validates :gender, presence: true

  validates :firstname, presence: true

  validates :lastname, presence: true


  def admin?
    self.role == 'admin'
  end

end

This second class should validate the record before invite! BUT, when I use the console to do the following:

u = BackUser.new
u.invite!

"u" is saved in database and an invitation is send to a blank email...

Do you know what I have to do?

Thans a lot!

Was it helpful?

Solution

I'm sure you've found a solution or workaround to your problem by now, but for any future SO users who encounter the same problem I found a pretty simple fix.

Devise Invitable's model configuration docs don't fully explain how to implement :validate_on_invite, but you have to set the configuration option to true - :validate_on_invite => true.

Here's what my devise method looks like in my User model for this to work correctly.

models/user.rb

# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :invitable, :database_authenticatable, :registerable,
       :recoverable, :rememberable, :trackable, :validatable, :validate_on_invite => true

Now when I attempt to submit an invitation it is fully validating the record with what the validations I've set up in my User model before allowing the invitation to be sent and the user record to be created. Looking at the docs, I'm guessing you can also enable this setting in the devise initializer, but I haven't tried going that route.

*Second possible option to enable validation if needed

config/initializers/devise.rb

config.validate_on_invite = true

OTHER TIPS

I've never been able to get the validation to work correctly for devise invitable. You can't use RobHeaton's suggestion either because you will receive a validation error on the password. I use this little hack to get validation to work:

  def create
    @user = User.new(user_params)
    @user.valid?
    @user.errors.messages.except!(:password) #remove password from errors
    if (@user.errors.any?)
      render 'new'
    else
      @user.invite!(current_user)
      redirect_to user_path(@user)
    end
  end  

It doesn't solve the mystery of why your behaviour is occurring, but:

if u.save
  u.invite!
end

will give the end result you are after.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top