2012-04-27 16 views
1

私のアプリケーションでユーザーを管理するためのCRUDインターフェイスの作業を進めています。私は一定のUser :: ROLESを持っています。これは、私のアプリ(admin、teacher、student)の有効なユーザ役割の名前を持つ配列です。ブロックを使用したインスタンス変数の名前付けと作成[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を作成しますRubyとRailsの新機能では、これを行うための構文がわかりません。知るか?とにかくそれを行うためのより良い方法があります。

EDIT

ただ、誰もが知っているように、私は彼らの役割によってグループ化されたユーザーのリストを表示するには、indexアクションのビューでこれを使用することを願っています。もちろん、それは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]'で特定のロールにアクセスしている場合は、ロール名を変更した場合と全く同じようにビューを変更する必要があります。 –

+0

ありがとうございます。私はグループメソッドとeach_pairについて知らなかった。それは大いに役立ちます。 – GorrillaMcD

+0

なぜ、わからないのですか?グループメソッドが機能していませんでした。グループ化せずに通常のようにユーザーレコードを返しました。 '@users = User.all.group_by(&:role)'を実行してしまい、期待通りに動作しませんでした。 – GorrillaMcD

関連する問題