2016-03-28 5 views
0

私は、ユーザが自分のRailsアプリケーションの投稿やコメントを編集できるかどうかをチェックする方法を持っています。ユーザーがエンティティの両方のタイプを所有することができますので、私は、このメソッドは、パラメータpost_or_commentとしてそれらのいずれかを取ることにしました:これは曖昧パラメータとして、このように任意のオブジェクトを取ることをお勧めしこのユーザー・メソッド・パラメーターの名前は?

class User < ActiveRecord::Base 
    def can_edit?(post_or_comment) 
    post_or_comment.user == self || self.admin? 
    end 
end 

、といパラメータのために私が選んだ名前は理にかなっていますか?

CanCanのような洗練されたユーザーロールハンドラに興味はありません。私は学んでいるので、簡単に保つことにします。

+4

私は2つの方法として2つの別々のテストを行い、次に2つの方法を便宜的に包む3つ目の方法を考えます。それは、テストの際により細分化することができます。それは管理者の役割であるため、管理者ができることは非常に明白です。特にコードを他の人と共有しようとする場合は特にそうです。任意の変数型を取ってしまうと、将来あなたが偶然に噛み付く可能性があります。そのため、セキュリティが関与しているので、あなたが意図していることを確認することは賢明です。 'post_or_comment'のようなパラメータ名はうまくいきますが、もしコードがそれを知りたいと思うかもしれないし、正しく扱いたくないパラメータを受け入れるならば。 –

+0

チャンスがあった場合、これの例を教えてください。 –

答えて

1

あなたのスキーマ内の投稿がコメントの一種であると理解されていれば、両方の種類に等しく適用されるという意味で、どちらかというと、 。

非常に正当な理由がない限り、過度に制限することを避けるのが一般的です。あなたはそれを所有されていないものを渡しているからだとあり、おそらくほとんどの時間の作品1にあなたの非常に具体的な方法を回すの方法だ、そうでない場合:

def can_edit?(thing) 
    # Admin can edit anything. 
    return true if (admin?) 

    case (thing) 
    when User 
    # Users can edit themselves 
    thing === self 
    else 
    if (thing.respond_to?(:user)) 
     # If the owner matches. 
     thing.user === self 
    else 
     # Don't really know, so say no by default. 
     false 
    end 
    end 
end 

このコードのための最悪の場合の障害状態が、それということです"いいえ"と言います。これで、userプロパティがあるかもしれないし、そうでないかもしれない任意のものを渡すことができ、それは期待通りに動作します。その他の特別な場合は、caseに別のwhenを追加することができます。

+0

ありがとう、私はこれが非常に便利だ( 'respond_to?'について知りませんでした)。質問: '=='の代わりに三重の平等を使用する理由はありますか? –

+0

@RolandoMurilloどちらもここで動作しますが、確かめるためにテストする必要があります。私は過去に '==='を使用して、ActiveRecordが2つのモデルを比較するために 'id'に基づいて同等のレコードであることを主張しました。 – tadman

関連する問題