2009-01-20 70 views
3

我有這個遍佈顯示在我的控制器:聲明式ruby編程替換if/then/else/RETURN/end?

if not session[:admin] 
    flash[:notice] = "You don't have the rights to do #{:action}." 
    redirect_to :action=>:index 
    return 
end 

而它的兄弟:

if not session[:user] and not session[:admin] 
    flash[:notice] = "You don't have the rights to do #{:action}." 
    redirect_to :action=>:index 
    return 
end 

我想所有的轉降低這一個聲明行,當我想用​​它在一個方法中:

def action_which_requires_rights 
    require_rights :admin 
    #or: 
    #:require_rights :user_or_admin 
end 

顯然,如果require_rights失敗,我不希望執行其餘的方法。我會發誓有辦法做到這一點,但我無法找到我讀到的地方。我在想像這個嗎?

回答

7

首先,你可以這樣做:的unless session[:admin]代替if not ...

然後你就可以有一個前過濾器調用你的方法,這個方法會做你的redirect_to的「URL」,並返回。

我有一個問題,我希望你不只是在會話中存儲管理員的身份,作爲唯一的身份驗證方式,在用戶模型中擁有一個屬性並查詢這可能是一個更安全的選擇。

2

看看before_filter。他們可以停止執行,並可以限制在某些行動。

1

如果不允許用戶執行這個動作(我會使用助手來實現這一目標)

在控制器,在其他的答案中提到,恕我直言,最好的辦法是,我不會展示給用戶的動作在過濾器之前使用來控制訪問權限。

我還建議使用平安身份驗證插件來管理用戶角色。

0

你可以嘗試一些引發異常的東西。

def action_for_admins 
    require_rights :admin 
end 

begin 
    action_for_admins 
rescue 
    <%= You don't have the rights to do that %> 
end 

然後require_rights看起來應該像

def require_rights(*rights) 
    rights.each do |right| 
    raise "Missing right #{right.to_s}" if not user.has_right?(right) 
    end 
end 

請注意,我在Ruby或者Rails的初學者,因此它可能不會是方式

5

正如其他人所說,before_filter在這裏似乎是正確的工具。但我會解決你所問的實際模式。

不幸的是,一個方法不能導致它的調用方法返回。該模式,你的兩個最接近的比賽正在尋找:

塊:

def require_rights(rights) 
    if session[rights] 
    yield 
    else 
    flash[:notice] = "You don't have the rights to do #{:action}." 
    redirect_to :action=>:index 
    end 
end 

所以,你會怎麼做:

def action_which_requires_rights 
    require_rights :admin do 
    #do whatever here 
    end 
end 

或返回值:

def require_rights(rights) 
    return true if session[rights] 
    flash[:notice] = "You don't have the rights to do #{:action}." 
    redirect_to :action=>:index 
    false 
end 

所以,你會這樣做:

def action_which_requires_rights 
    require_rights :admin or return 
    #do whatever here 
end 

我更喜歡這個塊,因爲它適合於類似的方法,並且使得調用者做到or return對我來說有點不自然。

+0

對於第一個示例,作爲一般ruby模式。 – 2009-01-21 17:35:29