Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

devise invitable do not validate model

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!

like image 299
p0k3 Avatar asked May 14 '13 08:05

p0k3


2 Answers

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
like image 188
Mikael Kessler Avatar answered Sep 24 '22 21:09

Mikael Kessler


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  
like image 33
Jimeh Avatar answered Sep 22 '22 21:09

Jimeh