0

これは少し初心者の質問かもしれませんが、とにかく尋ねています。

だから私は人々が投稿するアプリを構築しています。だからソーシャルネットワークです。

しかし、他の人の投稿を編集したり削除したりできるようにしたくありません。

ここでは役割ベースのシステムは機能しないと思います。なぜなら、人々は自分の投稿のみを管理するからです。

ある種の AR アソシエーションを考えていましたが、うまくいくかどうかはわかりません。

私が欲しいのは、私の場合は次のようなものですapp/models/ability.rb:

class Ability
  def initialize(user)
    if current_user.username == @post.username
      can :edit, Post
      can :destroy, Post
    end
  end 
end

これを行うにはどうすればよいですか (モデルがUserと であると仮定Post)?

したがって、基本的にはUser has Posts、または User has and belongs to Postsを実行する必要がありますか?

4

2 に答える 2

2

これを使って

class Ability
  def initialize(user)
    can [:edit, :destroy], Post do |post|
      post.try(:user) == user
    end
  end 
end
于 2012-11-18T17:27:01.777 に答える
0

問題は、クラスがインスタンス変数Abilityにアクセスできないことです。したがって、ユーザーが Post オブジェクトを作成、編集、および破棄できるようにする必要がある@postと思います。次に、自分の投稿のみを編集および破棄できるようにするのは、コントローラーとモデル レイヤー次第です。Ability.rbcan :manage, Post

CanCan を使用するとload_and_authorize_resource、コントローラーの上部で呼び出して全体を保護できますが、この場合、PostsControllerおそらくアクション レベルで保護する必要があります。たとえば、 、 、および アクションをauthorize! :manage, @post呼び出すcreateことdestroyedit、が自分の投稿のみを変更できることを確認できます。updatecurrent_user.username == @post.username

最後に、投稿を実際に削除するのではなく、単に投稿を削除済みとしてマークするだけで「ソフト削除」してもらいたい場合があります。この場合、投稿の作成と編集を明示的に許可しますが、実際のdestroy投稿は許可しません。indexandアクションで、show削除済みとしてマークされた投稿が表示されないようにします。

役割ベースのシステムに関しては、将来、モデレーターのグループが必要になるか、別の管理者を追加する必要があるかもしれません。そんなときは、役割ベースのシステムが必要になります。私はほとんどの場合、最初から役割ベースで作成していadminますuser

于 2012-11-18T17:25:18.627 に答える