2012-12-02 18 views
7

Szukałem już około godziny i znalazłem ogromną ilość pytań opisujących, jak dodawać pola do modelu użytkownika Devise. Jednak nie mogłem znaleźć żadnego wyjaśnienia w jasny sposób, jak dodać jeden lub wiele modeli do procesu rejestracji.Szyny Wymyśl rejestrację z dodatkowym modelem

Przy rejestracji Chcę, aby użytkownik wypełnił adres e-mail, hasło, a dodatkowo mój model klienta, model firmy i model adresu (tak, że mam wszystkie informacje potrzebne do prawidłowego działania aplikacji internetowej).

Moje modele są jak ten

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 

Myślę, że jedynym sposobem, aby to zrobić, to stworzyć własną RegistrationsController więc mogę zrobić @client = Client.new a następnie zrobić to moim zdaniem:

<%= 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 %> 

Powodem muszę go do pracy w ten sposób ponieważ mam wielu użytkowników, którzy mogą reprezentować tego samego klienta (i dlatego potrzebują dostępu do tych samych danych). Mój klient jest właścicielem wszystkich danych w aplikacji i dlatego musi zostać utworzony, zanim aplikacja będzie mogła zostać użyta.

Odpowiedz

6

OK, zajęło mi to około 8 godzin, ale w końcu zorientowałem się, jak to zrobić (jeśli ktoś ma lepszy/czysty sposób robienia tego, proszę dać mi znać).

Najpierw stworzyłem własną rękę Devise::RegistrationsController aby poprawnie zbudować zasób:

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 

Po tym ja po prostu potrzebne, aby ustawić config/routes.rb, aby to działało:

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

także Wystąpił błąd w moim devise/registrations/new.html.erb. Powinien być f.simple_fields_for :client zamiast f.simple_fields_for @client.

Teraz poprawnie tworzy wszystkie obiekty dla zagnieżdżonych atrybutów i automatycznie zapisuje je podczas zapisywania zasobu.

Powiązane problemy