Rails: Using Devise with single table inheritance

后端 未结 4 1779
春和景丽
春和景丽 2020-12-07 14:51

I am having a problem getting Devise to work the way I\'d like with single table inheritance.

I have two different types of account organised as follows:

<         


        
4条回答
  •  鱼传尺愫
    2020-12-07 15:21

    There is an easy way to handle STI in the routes.

    Let's say you have the following STI models:

    def Account < ActiveRecord::Base
    # put the devise stuff here
    devise :database_authenticatable, :registerable,
        :recoverable, :rememberable, :trackable, :validatable
    end
    
    def User < Account
    end
    
    def Company < Account
    

    A method that is often overlooked is that you can specify a block in the authenticated method in your routes.rb file:

    ## config/routes.rb
    
    devise_for :accounts, :skip => :registrations
    devise_for :users, :companies, :skip => :sessions
    
    # routes for all users
    authenticated :account do
    end
    
    # routes only for users
    authenticated :user, lambda {|u| u.type == "User"} do
    end
    
    # routes only for companies
    authenticated :user, lambda {|u| u.type == "Company"} do
    end
    

    To get the various helper methods like "current_user" and "authenticate_user!" ("current_account" and "authenticate_account!" are already defined) without having to define a separate method for each (which quickly becomes unmaintainable as more user types are added), you can define dynamic helper methods in your ApplicationController:

    ## controllers/application_controller.rb
    def ApplicationController < ActionController::Base
      %w(User Company).each do |k| 
        define_method "current_#{k.underscore}" do 
            current_account if current_account.is_a?(k.constantize)
        end 
    
        define_method "authenticate_#{k.underscore}!" do 
        |opts={}| send("current_#{k.underscore}") || not_authorized 
        end 
      end
    end
    

    This is how I solved the rails devise STI problem.

提交回复
热议问题