2012-08-28 54 views
2

我使用Rails設計用戶認證的寶石,但現在我的店我必須引入discont的用戶羣,特殊價格等。如何用設計做到這一點?請注意,這是一對多的,因爲每個用戶可以有多個組,並且每個組都有一些用戶。Rails設計寶石和用戶羣

而且,當用戶正在註冊I'T基團必須是對實施例1

設計有「關閉」控制器(未在authlogic)。這也是麻煩。

def create 
    super 
    group = Group.find_by_name("newuser") 
    user_group = UserGroup.create 
    user_group.user_id = current_user.id 
    user_group.group_id = group.group_id 
    user_group.save 
    end 

回答

12

這不一定必須與設計集成,除非我讀錯了你的問題。只要創建描述一組屬性組模型和用戶組連接模型:

class UserGroup < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :group 
end 

class User < ActiveRecord::Base 
    has_many :user_groups 
    has_many :groups, :through => :user_groups 

    # attr_accessible :user_id, :group_id 
end 

class Group < ActiveRecord::Base 
    has_many :user_groups 
    has_many :users, :through => :user_groups 
end 

至於封閉控制的問題,可以解除設計控制器到您的應用程序,或創建一個新的控制器,它繼承自它並因此覆蓋方法。從他們的link GitHub page here閱讀更多。

編輯:我認爲你是從錯誤的角度來接近這一點。您無需從Devise的控制器中執行任何操作,而是將before_save回調添加到您的用戶模型中。

class User < ActiveRecord::Base 
    before_save(:on => :create) :assign_default_group 

    # Other model stuff here 

    private 

    def assign_default_group 
    # This automatically creates the UserGroup record 
    self.groups << Group.find_by_name("User") 
    end 
end 
+0

但如何在我的控制器中寫入相同的設計註冊邏輯? – byCoder

+0

@PavelBY如果您重寫註冊操作,您仍然可以在重載操作中通過'super'調用它。對於Rails中的所有可重寫方法都是如此。你想在行動中改變什麼?我認爲這可以通過其他方式做得更好。 – zykadelic

+0

但是如何以其他方式做呢? – byCoder