2010-05-21 55 views
0

我的Rails應用程序有一個用戶模型和一個組模型,其中用戶屬於一個組。由於這一點,用戶可以是管理員,經理,訂戶等。用戶組的Rails插件

直到最近,例如,當需要在應用程序上創建新的管理員時,該過程只是創建一個新的普通帳戶,然後管理員將新的普通帳戶的group_id屬性設置爲管理員的組ID ...在我的用戶控制器中使用了一些條件。但我認爲這不是很乾淨。因爲對於安全,我需要添加這樣的代碼(例如)用戶#更新時間:

class UsersController < ApplicationController 
    # ... 
    def update 
    @user = User.find(params[:id]) 
    # I need to add some lines here, just as on the bottom of the post. 
    # I think it's ugly... in my controller. But I can not put this 
    # control in the model, because of current_user is not accessible 
    # into User model, I think. 
    if @user.update_attributes(params[:user]) 
     flash[:notice] = "yea" 
     redirect_to root_path 
    else 
     render :action => 'edit' 
    end 
    end 
    # ... 
end 

有沒有乾淨的方式做到這一點,用Rails插件?或不...

通過更乾淨,我認爲這可能是更好的,如果從用戶#更新這些行:

if current_user.try(:group).try(:level).to_i > @user.try(:group).try(:level).to_i 
    if Group.exists?(params[:user][:group_id].to_i) 
    if Group.find(params[:user][:group_id].to_i).level < current_user.group.level 
     @user.group.id = params[:user][:group_id] 
    end 
    end 
end 

...從控制器中刪除和應用程序能夠僅噹噹前用戶的組級別比編輯的用戶更好時才設置組。但是,也許我錯了,也許我的代碼是尚不完善:)

注:在我的用戶模型中,有這樣的代碼:

class User < ActiveRecord::Base 
    belongs_to :group 
    attr_readonly :group_id 
    before_create :first_user 
    private 
    def first_user 
    self.group_id = Group.all.max {|a,b| a.level <=> b.level }.id unless User.exists? 
    end 
end 

你認爲這是一個好辦法嗎?或者你處理不同?

謝謝。

+0

定義「乾淨的方式」?你的代碼不乾淨,你想重構它。然後顯示代碼。從你的描述中我不太明白你想達到什麼目的?用戶將永遠必須以某種方式分配給組。 – nathanvda 2010-05-21 10:42:41

+0

感謝您的幫助。我更新了我的帖子,以便更容易理解。 – moshimoshi 2010-05-23 10:10:42

回答

0

我更喜歡將控制器方法變得精益和小巧,並將實際的模型邏輯放入模型中(它屬於哪個模型)。

在您的控制器我會寫沿

def update 
    @user = User.find(params[:id] 
    if @user.can_be_updated_by? current_user 
    @user.set_group params[:user][:group_id], current_user.group.level 
    end 
    # remove group_id from hash 
    params[:user].remove_key(:group_id) 
    if @user.update_attributes(params[:user]) 
    ... as before 
end 

,並在模型線的東西你會

def can_be_updated_by? (other_user) 
    other_user.try(:group).try(:level).to_i > self.try(:group).try(:level).to_i 
end 

def set_group(group_id, allowed_level) 
    group = Group.find(group_id.to_i) 
    self.group = group if group.present? && group.level < allowed_level 
end 

這是否幫助?

+0

謝謝你,nathanvda。是的,幫助我!我也這麼認爲,模型內部的模型邏輯更好;) – moshimoshi 2010-05-29 16:11:59

0

那麼,如果你有一個用戶/組(或用戶/角色)模型,沒有比你強調的其他方法。

如果它是o ne-to-many association you can choose to store the user group as a string and if it is a many-to-many association you can go for a bitmask但無論是通過業務邏輯還是管理員選擇,都需要設置用戶/組關係。

關於如何在視圖中設置此關係,您可以有多種選擇。

爲了擴展您的模型的功能,我建議您使用CanCan,這是一款非常好的授權寶石,它使您可以輕鬆地在您的Rails應用程序中允許細粒度訪問每個資源。