2011-07-20 7 views
1

私のコントローラでは、このにレールの道を達成するための最良の方法がある場合、私は思ったんだけど:コントローラのRailsセキュリティ検証?

def show 
    @article = Article.find(params[:id]) 
    # you can only view a public article or your own articles. 
    @article = nil unless @article.public? || @article.owner?(current_user) 
end 

def edit 
    @article = Article.find(params[:id]) 
    # you can only edit your own articles 
    @article = nil unless @article.owner?(current_user) 
end 

私は自分のアプリケーションでこのようなカップルの検証を持っていると私はそれが1を欠場するのは簡単ですはっきりと見ることができるとあなたがしてはならないものにアクセスしてください!

ありがとう

答えて

1

これはRailsの方法ではありません。レールの原則の1つは、モデルレイヤー上のすべてのオブジェクト操作を取ることです。コントローラは、全体的な認証/認証/キャッシュの無効化/クッキーとセッションの設定を主に気にします。あなたは正直なところ団体範囲

class ArticlesControllers << ApplicationsController 

    def show 
    @article = current_user.articles.public.find(params[:id]) 
    end 

end 

class Article < ActiveRecord::Base 
    scope :public, :where('public').is('true') 

end 
+0

これは私が探していたものではありませんが、それはスタートです。これはもっと良い方法ですが、公開記事か自分の記事のどちらかを持っていることを意味する自分のOWNとPUBLICの記事を手に入れます。 –

+0

「Article.public.find(params [:id])|| current_user.articles.find(params [:id])」のようなものが役に立つでしょうか? –

+0

あなたはモデルのメソッドにラップすることをお勧めします。 current_userをparamsとして渡し、条件式をメソッドに移動する – Anatoly

1

を使用することができます

、私はCanCanを使用すると思います。

can :read, Article, public: true 
can :manage, Article, owner_id: user.id