2012-12-02 21 views
7

Ich habe jetzt etwa eine Stunde gesucht und eine immense Menge an Fragen gefunden, die beschreiben, wie Felder zum Devise-Benutzermodell hinzugefügt werden. Ich konnte jedoch keine finden, die klar erklären, wie man ein oder mehrere Modelle zum Registrierungsprozess hinzufügt.Rails Devise Registrierung mit einem zusätzlichen Modell

Bei der Registrierung möchte ich, dass der Benutzer eine E-Mailadresse, ein Passwort und zusätzlich mein Kundenmodell, Firmenmodell und Adressmodell ausfüllt (damit ich alle Informationen, die die Webapplikation benötigt, richtig ausführen kann).

Meine Modelle sind wie diese

user.rb

class User < ActiveRecord::Base 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    attr_accessible :email, :password, :password_confirmation, :remember_me, :client 

    belongs_to :client 
end 

client.rb

class Client < ActiveRecord::Base 
    attr_accessible :bankaccount, :email, :logo, :mobile, :phone, :website 

    has_many :users 

    has_one :company 
    has_one :address 
    accepts_nested_attributes_for :company, :address 
end 

denke ich, der einzige Weg, dies zu tun, ist meine eigene RegistrationsController zu schaffen, so kann ich @client = Client.new tun und tun dies dann meiner Meinung nach:

<%= f.simple_fields_for @client do |ff| %> 
    <%= f.simple_fields_for :company do |fff| %> 
    <% field_set_tag t(:company) do %> 
     <%= ff.input :name %> 
    <% end %> 
    <% end %> 
    <%= f.simple_fields_for :address do |fff| %> 
    //address inputs 
    <% end %> 
    <% end %> 

    <fieldset> 
    <legend><%= t(:other) %></legend> 
    // other inputs 
    </fieldset> 
<% end %> 

Der Grund, warum ich es brauche diese Art und Weise zu arbeiten liegt daran, dass ich mehrere Benutzer habe, die denselben Client repräsentieren können (und somit auf dieselben Daten zugreifen müssen). Mein Client besitzt alle Daten in der Anwendung und muss deshalb erstellt werden, bevor die Anwendung verwendet werden kann.

Antwort

6

Okay, ich habe ungefähr 8 Stunden gebraucht, aber ich habe endlich herausgefunden, wie es funktioniert (wenn jemand eine bessere/sauberere Methode hat, lass es mich wissen).

Zuerst habe ich meine eigene erstellt Devise::RegistrationsController, um richtig auf die Ressource zu bauen:

class Users::RegistrationsController < Devise::RegistrationsController 

    def new 
    resource = build_resource({}) 
    resource.build_client 
    resource.client.build_company 
    resource.client.build_address 
    respond_with resource 
    end 

end 

Danach habe ich nur anpassen benötigt config/routes.rb es Arbeit zu bilden:

devise_for :users, :controllers => { :registrations => "users/registrations" } do 
    get '/users/sign_up', :to => 'users/registrations#new' 
    end 

Auch Ich hatte einen Fehler in meiner Datei/registrations/new.html.erb. Es sollte f.simple_fields_for :client statt f.simple_fields_for @client gewesen sein.

Nun werden alle Objekte für die verschachtelten Attribute ordnungsgemäß erstellt und beim Speichern der Ressource automatisch gespeichert.

Verwandte Themen