2011-04-07 4 views
1

シンプルで一般的なシナリオを想定しましょう。Railsのモデルで2つの 'アクセスレベル'を持つには?

Userモデルはadminフィールドです。ユーザーはadminフィールドを編集できませんが、管理者は誰のadminフィールドも編集できます。

したがって、両方のタイプのユーザーに適切なアクセス権を付与する必要があります。私はRESTfulな方法でこれを提示したい場合は、私は2つのリソースを持っていると思います

は、

resource :user 
namespace :admin do 
    resources :users 
end 

言う...そして、ここにジレンマ来る - どのように私がコントロールしないadminフィールドを変更することができますどこにいないの?

  1. attr_protected :adminは、ユーザーが管理ステータスを変更できないように設定できます。しかし、私は私が

    params[:user].delete(:admin) 
    

両方をさらに悪くなるUsersControllerでパラメータを、スクラブすることができます

@user.admin = params[:user][:admin] 
  • のように、Admin::UsersControllerでそれのうち特殊なケースを作る必要があるだろうこれらのソリューションの中で私は乱雑に見えます。そのような状況に対処する正しい方法は何ですか?

    2つ以上のアクセスレベルがある場合はどうなりますか?

  • +0

    あなたがあなたの悩みを緩和する工夫やdeclarative_authorizationのようなACLのプラグインを試してみましたか? – corroded

    +0

    まあ、Deviseは認証のみを処理し、declarative_authorizationはモデルごとのレベルで動作しますが、フィールドごとのレベルで制御したいのです。 –

    答えて

    2

    サブクラス化についてはどうですか?おそらくこのようなものを試してみてください。

    次に、各コントローラで適切なモデルを使用してください。 Userクラスでattr_protectedを使用している場合、ARは(現在)インテリジェントにそれらを適用していないため、このシナリオでは機能しません。adminは1つにしか存在できません。とにかくattr_accessibleを使用する方が一般に良い方法です。 Jonの優秀な答えに

    users/guest 
    users/user 
    users/admin 
    

    admin<user 
    

    user<guest 
    

    ビル、次のような何かを試みることができる:

    1

    のようなものを見て、あなたのリソースを再加工考えてみましょう:

    class Guest < ActiveRecord::Base 
        attr_accessible :columns, :that, :are, :safe, :for, :guests 
        attr_reader :is_admin 
    end 
    
    class User < Guest 
        attr_accessible :more, :stuff, :for, :users 
    end 
    
    class AdminUser < User 
        attr_accessible :some, :adminThings, :here 
        attr_writer :is_admin 
    end 
    

    ... AdminUserは、ゲストのis_adminに対してattr_readを継承します。助け

    ・ホープ - Railsの3.1は、私が望んでいた正確に何がありますように

    ペリー

    関連する問題