I’m using rails 3.2 and devise 2.0 and I’m quite new to Rails.
Requirements
I’d like to achieve the following:
- have 2 or more “user” models, eg. Member, Customer, Admin
- all models share some required fields (eg. email and password)
- each model may have some unique fields (eg. company for Customer only)
- some fields may be shared but not have the same validation (eg. name is required for Customer but optional for Member)
- all fields must be filled during the registration process, so the forms are different
- the login form should be unique
Possible solutions
I googled and searched StackOverflow for quite a long time, but nothing seems right to me (I’m a Java guy, sorry 🙂 and now I’m quite confused. Two solutions came up:
Single devise user
That’s the most frequent answer. Just create the default devise User and create relations between Member–>User and Customer–>User.
My concern here is how can I achieve a customized registration process for each model? I tried different things but all ended as a mess!
Multiple devise users
This solves the custom registration process, and seems right to me, but the unique login form is a blocker. I found an answer on SO (Devise – login from two model) which suggests to override Devise::Models::Authenticatable.find_for_authentication(conditions).
That seems complicated (?) and since I’m new to rails, I’d like to know if that could work?
Thanks for your advice!
I found a way to go and I’m quite happy with it so far. I’ll describe it here for others.
I went with the single “user” class. My problem was to achieve a customized registration process for each pseudo model.
model/user.rb:
Then I adapted http://railscasts.com/episodes/217-multistep-forms and http://pastie.org/1084054 to have two registration paths with an overridden controller:
config/routes.rb:
controllers/users/registrations_controller.rb:
I created a wizard class which knows the fields to validate at each step
and my views are:
new.rbnew_client.rbincluding a partial according to the wizard step:_new_client_1.rb_new_client_2.rbnew_member.rbincluding a partial according to the wizard step:_new_member_1.rb_new_member_2.rb