Rails полиморфная пользовательская модель с Devise - PullRequest
4 голосов
/ 04 марта 2012

Итак, я знаю, что этот вопрос задавался множество раз, но мой вопрос идет немного дальше.

При моделировании моего приложения у меня есть два типа пользователей, которые имеют полиморфную связь с моделью пользователя. Такие как:

class User < ActiveRecord::Base
    belongs_to :profileable, :polymorphic => true
end

class User_Type_1 < ActiveRecord::Base
    has_one :user, :as => :profileable
end

class User_Type_2 < ActiveRecord::Base
    has_one :user, :as => :profileable
end

Причина, по которой я сделал это вместо STI, заключается в том, что User_Type_1 имеет что-то вроде 4 полей, а User_Type_2 имеет что-то вроде 20 полей, и я не хотел, чтобы в пользовательской таблице было так много полей (да, 24 иш полей не много, но я бы предпочел не иметь ~ 20 полей пустыми большую часть времени)

Я понимаю, как это работает, мой вопрос: я хочу, чтобы форма регистрации использовалась только для регистрации пользователей типа User_Type_1, но форма входа использовалась для обоих. (У меня будет административная часть приложения, которая будет создавать пользователей User_Type_2)

Я знаю, что могу использовать переопределение after_sign_in_path_for(resource) в AppicationController для перенаправления в правую часть сайта при входе. Что-то вроде:

def after_sign_in_path_for(resource)
    case current_user.profileable_type
    when "user_type_1"
        return user_type_1_index_path
    when "user_type_2"
        return user_type_1_index_path
    end
end

Итак, я думаю, мои вопросы: как заставить форму работать с Devise и разрешить регистрацию только типа User_Type_1, а затем войти в нее после sign_up?

Кроме того, если я поступаю неправильно, каков правильный путь?

1 Ответ

5 голосов
/ 05 марта 2012

Я смог ответить на свой вопрос и задаю его здесь, чтобы, возможно, он мог помочь кому-то еще с той же проблемой.

Проблема с входом в систему была простой, просто используйте логин devise по умолчанию и after_sign_in_path_for в ApplicationController как описано выше

Я понял ответ на вопрос о форме, набрав его здесь:

Я только что создал нормальную форму для User_Type_1 с вложенными атрибутами дляUser и отправил его в UserType1Controller Затем сохранил оба объекта и вызвал sign_in_and_redirect помощник из Devise

class UserType1Controller < ApplicationController
    ...
    def create
        @user = User.new(params[:user])
        @user_type_1 = UserType1.new(params[:patron])
        @user.profileable = @user_type_1
        @user_type_1.save
        @user.save
        sign_in_and_redirect @user
    end
    ...
 end

Затем метод after_sign_in_path_for сверху отправил его в нужное место и онвсе было хорошо.

...