2011-12-02 154 views
3

我正在制定一個系統,它有2個模型,用戶模型,學校模型。圍欄擴展設計註冊表

我正在使用具有'角色'的常規用戶sign_up的設計註冊作爲附加字段來指示用戶是普通用戶還是學校用戶。

現在有一個管理員用戶創建一個新的學校記錄,而用戶將使用devise/sign_up操作進行註冊。學校還沒有登錄信息。

我可以撥打學校/新行動(作爲學校註冊鏈接)來添加一所新學校。

相反,我想擴展學校的設計註冊,它將使用「新學校註冊鏈接」作爲新用戶(對於用戶模型使用電子郵件,密碼,角色='學校')和其他字段,地址等進入正規學校表。這樣學校管理員也獲得一個登錄帳戶。

如何擴展設計/註冊表單並創建這2條記錄?

我真的很欣賞一些想法。

+0

任何想法?沒有?我正在考慮擴展school/new.html.erb以使用「form_tag」而不是「form_for」,將表單擴展爲包含用戶模型參數,例如電子郵件/密碼/角色。閱讀create_action中的參數,創建2條記錄(用戶模型和學校模型)。這有意義嗎?我真的很感激任何能夠引導我走向正確方向的想法。謝謝。 – Atarang

+0

沒關係。得到它的工作。通過重寫設計的registrations_controller和視圖。 – Atarang

+0

我建議把你的答案! –

回答

0

覆蓋色器件註冊路線:

的routes.rb:

devise_for :users, controllers: {registrations: 'registrations'} 

創建控制器/ registrations_controller.rb:

class RegistrationsController < Devise::RegistrationsController 

    after_filter :add_school 

    protected 

    def add_school 

     if resource.persisted? # user is created successfuly 

      # resource holds all your form data. 
      resource.schools.build do |school| 
       school.name = resource.school_name # form fields... 
      end 

      @school.save 
     end 
    end 
end 

爲了驗證學校字段添加驗證您user.rb模型

例如:

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 

    devise :database_authenticatable, :registerable, 
      :recoverable, :rememberable, :trackable, :validatable 

    validates :name, 
       presence: true, 
       length: {in: 1..50} 

    validates :school_name, 
       presence: true, 
       length: {in: 1..50} 
end 

僅供參考:

<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %> 
    <%= devise_error_messages! %> 

    <div><%= f.label :school_name %> 
     <br/> 
     <%= f.text_field :name, autofocus: true %></div> 

    <div><%= f.label :email %> 
     <br/> 
     <%= f.email_field :email %></div> 

    # ... 

    <div><%= f.label :school_name %> 
     <br/> 
     <%= f.text_field :school_name %></div> 

    <div><%= f.submit "Sign up" %></div> 
<% end %>