2012-03-04 4 views
4

Так что я знаю, что этот вопрос задавал тонну раз, но мой вопрос идет немного дальше.Rails полиморфная модель пользователя с Devise

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

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 

Причина я сделал это, а не ИППП, потому, что 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?

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

ответ

5

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

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

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

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

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 сверху отправил его в нужное место, и все было хорошо.

Смежные вопросы