0

次のことを行うためのより良い方法があるかどうか疑問に思っています。

ユーザーhas_manyプロジェクト

プロジェクトhas_manyリスト

リストhas_manyアイテム

特定のユーザーは特定のプロジェクトにのみアクセスできます。ただし、ユーザーがプロジェクトにアクセスできる場合、ユーザーはそのプロジェクトに属するすべてのリストとアイテムにアクセスできます。

これが私がクリーンアップしたい方法です:

def check_for_user_access(resource, resource_class, user)
  case resource_class
    when 'Project'
      if resource.user == user
        return true
      end
    when 'List'
      if resource.project.user == user
        return true
      end
    when 'Item'
      if resource.list.project.user == user
        return true
      end
    else
      return false
  end
end

アクセスは実際にはProjectに関連付けられているだけなので、ListとItemにuser_id属性は必要ありませんでした。

わずかに異なる比較をラップアラウンドするswitchステートメントを使用するよりもこれを行うためのより良い方法はありますか?

前もって感謝します!

4

2 に答える 2

1

おそらく、これを行うより簡単な方法は、allow_access を定義することですか? これらのリソース クラスのそれぞれに対するメソッド – コントローラーがしなければならないことは、ユーザーが許可されているかどうかをリソースに尋ねることだけです。次に例を示します。

class Project < ActiveRecord::Base #I assume
  def allow_access?(user)
    return self.user == user
  end
end

class List < ActiveRecord::Base
  def allow_access?(user)
    return self.project.user == user
  end
end

class Item < ActiveRecord::Base
  def allow_access?(user)
    return self.list.project.user == user
  end
end

そして、必要に応じて、User モデルにラッパーを配置します。

class User < ActiveRecord::Base
  def can_access?(resource)
    resource.allow_access?(self)
  end
end

そして、あなたの方法は次のように置き換えることができます

user.can_access?(resource)

少し厳密にしたい場合は、 User モデルで、リソースが allow_access? に応答するかどうかを確認できます。そうでない場合は適切に対応します…</p>

于 2012-04-24T00:41:55.187 に答える
0

2つのこと:

1)あなたの状況を考えると、belongs_to :userリストとアイテムに追加することを検討します。それらは1人のユーザーにしか属せないように見えるからです。

これをリスト モデルとアイテム モデルで複製しても問題はありません。また、アプリ内の特定のオブジェクトが誰に属しているかを確認する方法が非常に簡単になります。

2) CanCanをチェックアウトする必要があります。これは非常にシンプルで軽量な Authorization ライブラリであり、あなたが扱っているようなものへのアクセスを規制するように設計されています。

于 2012-04-24T00:40:50.113 に答える