2012-04-27 87 views
1

我正在使用CRUD界面來管理我的應用程序中的用戶。我有一個常數User :: ROLES,它是一個在我的應用程序中具有有效用戶角色名稱的數組(管理員,教師,學生)。使用塊命名和創建實例變量[Ruby-on-Rails]

我想要做的是,在控制器的索引操作中,有一個塊遍歷ROLES常量,並從@users(已經在塊之前初始化)創建一個範圍實例變量。下面是該指數方法貌似至今:

def index 
    @users = user.all 
    #@students = @users.where(:role => "student") # This works by itself 
    User::ROLES.each do |r| 
     @r = @users.where(:role => r.to_s) 
    end 
end 

所以我希望能夠通過命名什麼的通過塊傳遞的實例變量,所以@r創建@admin,@teacher等。由於我新的紅寶石和鐵軌,我不太明白這樣做的語法。誰知道?反正可能有更好的方法。

編輯

只是爲了讓大家知道,我希望在視圖中使用的索引操作顯示由自己的角色進行分組的用戶列表。當然,在整個CRUD界面中它也會以其他方式使用,這就是爲什麼我之前沒有澄清用例,因爲它是多用途的。

回答

6

這可能是一個壞主意。如果在模型中更改角色,則需要相應地更新視圖以使用其他實例方法。一個更好的辦法來處理這將是由他們的作用只是一羣用戶:

@users = User.group(:role).all 

這將使你與每個角色命名的鍵,你可以很容易地用它來建立一個動態視圖的哈希:

<% @users.each_pair do |role, users| %> 
    <h2><%= role.to_s.titlelize %></h2> 
    <% users.each do |user| %> 
    ... 
    <% end %> 
<% end %> 

您還可以根據需要訪問的用戶具有特定角色:

<h2>Admin users:</h2> 
<%= @users[:admin].map(&:name).to_sentence %> 
+0

「如果你在你的模型中改變一個角色,你將需要更新您的視圖中使用不同的實例方法」。現在你自相矛盾。如果您通過「@users [:admin]」訪問特定角色,則必須以完全相同的方式調整視圖,方法是更改​​角色名稱。 – 2012-04-27 21:51:23

+0

謝謝。我不知道組方法和each_pair。這有很大幫助。 – GorrillaMcD 2012-04-27 22:21:58

+0

嗯,我不知道爲什麼,但組方法不起作用。它像正常一樣返回用戶記錄,無需分組。我最終做了@users = User.all.group_by(&:role)',然後按預期工作。 – GorrillaMcD 2012-05-07 22:53:01