2011-01-10 5 views
2

ねえ、私が助けてくれることを願っています。あなたのレコードを編集するようにユーザーを制限する方法

私は製作宝石とレール3を使用しています。
私は、ユーザーが作成した投稿/コメントのみを編集できるようにする方法を見つけようとしています。
これにCanCanの宝石を追加してもいいですか、それとも私はそれをdeviseで行うことができますか?または、単純なActive Recordクエリが可能ですか?

多くのありがとうございます。

+0

IMO cancancanは長期的な視点から進む方法です。あなたはより多くのパワーとコントロールを持っていますが、小さな学習曲線を犠牲にしています。 – BKSpurgeon

答えて

6

Deviseはコントローラ、モデル、およびビューで使用できるハッシュcurrent_userを作成します。したがって、次のようなチェックを作成するのは簡単です:

@comment = Comment.find(params[:id]) 
if current_user.id == @comment.user.id 
    # yadda 
end 
+1

または 'current_user.comments.include?(@ comment) ' – Garrett

+0

この方法を使用すると、悪意のあるユーザーがURLを編集して他のユーザーに属する投稿/コメントを編集できるようになると思います。 (つまり.../comments/1/edit)これで、ユーザーが今説明した方法で編集を行えないのを忘れましたか? – Nick

1

CanCanはあなたのニーズに少し過剰ですが、後の進化のためにはより柔軟です。

それ以外の場合は、user_idとauthor_idを比較してください。

class PostsController < ApplicationController 
    def edit 
    # Instead of this: 
    # Post.find(params[:id]) 
    # Use this: 
    current_user.posts.find(params[:id]) 
    end 
end 

これは場合にのみポストを見つけます:

+0

ありがとう!私はCanCanを念頭に置いておきます:D – daniel

10

あなたはUserPost/Commentとの関係を持っていると仮定すると、あなたはあなたのeditアクションでユーザーに属するレコードをフェッチだけに、この関係を使用することができます現在のユーザーが作成しました。

もちろん、updateのアクションも変更する必要があります。

+0

素晴らしい!返信ありがとうございます – daniel

+0

ポストが見つからない場合、自動的に404の応答が表示されます。うーん..しかしそれは技術的に正しいものではありません。 「許可されていない」などの方が良いかもしれません。 – Heikki

+0

'current_user'はUserです。 – Heikki

関連する問題