2009-05-26 13 views
26

私はレール上でルビーを学んでいるだけで、ユーザーの役割(所有者、管理者、ユーザー)の表があります。コードには、ユーザーの役割を確認し、さまざまなオプションを表示する必要がある場所があります。誰も魔法の数字や他の醜い方法に頼らずにこれを行う方法を知っていますか?データベース内の各異なる役割が価値を持つ列挙型として反映されるRails列挙型または代替方法

public enum UserRole { Owner = 1, Admin = 2, User = 3 } 

// ... 

if (user.Role == UserRole.Admin) 
    // Show special admin options 

:私は私に働いてきたASP.NetのWebアプリケーションでは

が、これは、列挙型を使用して行って見てきましたデータベース内のそのロールのIDに設定します。それは変わるかもしれないデータベースの知識に依存するので、非常に良い解決策のようには見えません。このようなことを処理するのが適切な方法であっても、列挙型をレールにどのように使用するのか分かりません。

この問題についての洞察をいただければ幸いです。

答えて

26

ルビー自体は、列挙型はありませんが、このサイトはあなたのUserモデルに次のようなものを作ることができる方法http://www.rubyfleebie.com/enumerations-and-ruby/

を示しています

#constants 
OWNER = 1 
ADMIN = 2 
USER = 3 

def is_owner? 
    self.role == OWNER 
end 

def is_admin? 
    self.role == ADMIN 
end 

def is_user? 
    self.role == USER 
end 
2

私は適切な名前を使用することを好むAuthorizationこのような状況のためのプラグイン。

これは単にアクセスをテストするための役割へのアクセスを制限し、

permit? "role" 

でき

permit "role" 

できるようになります。両方ともUser#has_role?(role)に委任します。

ObjectRolesの実装を使用する必要はありません。 Hardwiredロールを使用して、独自のスキーマを使用する独自のUser#has_role?(role)メソッドを実装することができます。

+0

また、ライアンベイツはカンカンと彼のサイト上での素敵なチュートリアル(http://railscasts.com/episodes/192と呼ばれる優れた認証宝石を持っています-autcanization-with-cancan) –

0

あなたがやるようenum pluginはのRubyForgeにあります:

t.column :severity, :enum, :limit => [:low, :medium, :high, :critical] 

これは、パラメータを渡す:limit属性を使用することはかなり醜いですが、それは、より標準化された方法です。インストールするには

だけで実行します。

script/plugin install svn://rubyforge.org/var/svn/enum-column/plugins/enum-column 

それはcurrenctly Railsの2.2.2以降で動作します。 Rubyforgeリンク:www.rubyforge.org/projects/enum-column/

4

これは私のclassy_enum宝石を使用するための本当に良いケースのようです。基本的に、固定されたオプションセットを定義することができます。それぞれのオプションは、それぞれ固有の動作とプロパティを持つクラスです。これは、アプリケーション全体に分散する傾向があるすべての条件付きロジックを削減するのに役立ちます。例えば

、あなたはこのようなことをやっている場合は、次の

class User < ActiveRecord::Base 
    def options 
    if user.is_admin? 
     [...admin options...] 
    else 
     [...non admin options...] 
    end 
    end 
end 

は次にとして呼び出す:どこかuser.options ...

class User < ActiveRecord::Base 
    classy_enum_attr :role 

    delegate :options, :to => :role 
end 

README作業例を持っており、詳細に宝石を説明します

classy_enumは、あなたが別の場所にそのロジックを移動していない条件付きロジックと同じ機能を持つことができます。

2

Rails(C#から)を学び始めたばかりで、まったく同じ質問だった。哲学が異なるため、Railsは実際にenumを持っていないようです。 C#プロジェクトですべての詳細を整理しようとすると、大量の列挙型を使用しますが、それほど重要ではないRailsの扱いが多分であるためです。これは実際には答えではなく、ただの観察です。

12

機能がRails 4.1に追加されましたか、探しているものでしょうか?

http://coherence.io/blog/2013/12/17/whats-new-in-rails-4-1.html

ブログ記事からコピー:

class Bug < ActiveRecord::Base 
    # Relevant schema change looks like this: 
    # 
    # create_table :bugs do |t| 
    # t.column :status, :integer, default: 0 # defaults to the first value (i.e. :unverified) 
    # end 

    enum status: [ :unverified, :confirmed, :assigned, :in_progress, :resolved, :rejected, :reopened ] 

... 

Bug.resolved   # => a scope to find all resolved bugs 
bug.resolved?   # => check if bug has the status resolved 
bug.resolved!   # => update! the bug with status set to resolved 
bug.status    # => a string describing the bug's status 
bug.status = :resolved # => set the bug's status to resolved