2

Rails、Devise、Mongoid を使用しています。

ユーザーは 1 つのプロジェクト ( ) しか持つことができませんhas_one :profileが、すべてのユーザー (および認証されていないユーザー) はプロジェクトのリストを見ることができます (私はこれを機能させています)。ユーザーがログインすると、プロジェクトの横に「編集と削除」ボタンが表示されます (これらのボタンを でラップすることにより<% if user_signed_in? %>)。ただし、サインインしたユーザーには、すべてのプロジェクトの横にこれらのボタンが表示され、すべてを編集または削除できます。

ログオンしたユーザーが自分のプロジェクトのみを編集できるように制限するにはどうすればよいですか?

おまけとして、サインインしているユーザーに属するプロジェクトの周りに特定のコンテンツや html を表示することは可能ですか (「これはあなたのプロジェクトです」というテキストや、プロジェクトの html の周りに追加のクラスなど)。

4

2 に答える 2

6

CanCan は、同じリソースを変更できる複数のユーザーがいて、誰がどの権限を持っているかを追跡する必要がある場合に最適です。しかし、プロジェクトを所有するユーザーだけがプロジェクトを変更できるというのが厳密なケースである場合、CanCan はおそらくやり過ぎです。

iouri の提案に従ってビュー内のリンクを非表示にし、コントローラーで次のようにします。

def edit
  if current_user != @project.user
    # Redirect them to an error page
  else
    # Render the view
  end
end

さらに良いことに、次のようなメソッドを作成します。

def user_owns_project?
  @project.user == current_user
end

次に、ユーザーがプロジェクトを所有していない場合に、編集、更新、および破棄の前にフィルターを設定して、エラー ページにリダイレクトします。

EDIT:あなたの前のフィルターもプロジェクトとセットを見つける必要があります@project。CanCan はこれも で処理してくれload_and_authorize_resourceますが、きめの細かいパーミッション コントロールが必要な場合、または必要になると予想される場合を除き、使用は避けたいと思います。

于 2012-10-01T22:58:44.037 に答える
2

工夫は「認証」を制御することであり、これはあなたの責任ではありません。

CanCanの方が優れているため、「承認」を制御したい。

于 2012-10-01T22:42:04.600 に答える