Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Devise: User belongs_to organization

I am using devise for authentication, and on the Sign Up page I have a text field for 'organization' so when the user signs up, they will create an organization, and I want the user to be associated with that organization (user model has organization_id attribute). I have created the devise views, and added a fields_for for the organization name. In my models I have User belongs_to :organization and Organization has_many :users (there will be more than one user associated to organizations). I have been down every path I could find trying to do this without modifying the controller, but have had no luck. Please don't suggest doing this without modifying the controller unless you have a sample app where you have implemented it that you can point to.

I have created a registrations controller as is laid out here: Override devise registrations controller

I just threw a few puts statements in the controller, and I don't see those being displayed on the console, so it looks like I am not getting to this controller.

I also copied my views from app/view/devise/registrations to app/views/registrations after which my views seem to come from outer space! The organization field I created no longer is displayed, and I can't seem to tell where the view is loaded from.

Sorry for not being more succinct, but I'm not sure where to go with this.

like image 568
Mark Locklear Avatar asked Nov 02 '11 20:11

Mark Locklear


1 Answers

You can use accepts_nested_attributes_for in your User model (documentation)

It should look like:

class User < ActiveRecord::Base
  belongs_to :organization
  accepts_nested_attributes_for :organization
end

class Organization < ActiveRecord::Base
  has_many :users
end

In views you could use Rails helper or create field by hand:

<input type="text" name="user[organization_attributes][name]">

<% user = User.new(organization => Organization.new) %>
<%= form_for user do |form| %>
  <%= form.fields_for user.organization do |organization_form| %>
    <%= organization_form.text_field :name %>
  <% end %>
<% end %>

EDIT: Your devise view should look like:

<h2>Sign up</h2>
<% resource.organization ||= Organization.new %>
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
  <%= devise_error_messages! %>
  <div><%= f.label :email %><br />
  <%= f.email_field :email %></div>

  <%= f.fields_for resource.organization do |organization_form| %> 
    <div><%= organization_form.label :name %><br />
    <%= organization_form.text_field :name %></div>
  <% end %>

  <div><%= f.label :password %><br />
  <%= f.password_field :password %></div>
  <div><%= f.label :password_confirmation %><br />
  <%= f.password_field :password_confirmation %></div>
  <div><%= f.submit "Sign up" %></div>
<% end %>
<%= render :partial => "devise/shared/links" %>
like image 138
Marek Tihkan Avatar answered Nov 13 '22 17:11

Marek Tihkan