Существует простой способ справиться с ИППП на маршрутах.
Допустим, у вас есть следующие модели STI:
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
Метод, который часто упускается из виду, заключается в том, что вы можете указать блок в методе аутентификации в вашем файле rout.rb:
## 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
Чтобы получить различные вспомогательные методы, такие как "current_user" и "authenticate_user!"(«current_account» и «authenticate_account!» уже определены) без необходимости определения отдельного метода для каждого (который быстро становится недоступным при добавлении новых типов пользователей), вы можете определить динамические вспомогательные методы в 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
Вот так я решил проблему с ИППП для рельсов.