2017-12-29 70 views
0

オブジェクトのuser_idが管理者ではないアカウントに関連付けられている場合、新しいレコードオブジェクトを無効にしようとしています。Railsは、モデルの管理者であるレコードを作成するユーザーを検証できますか?

モデルでは、作成するオブジェクトがuser_id.admin == trueの場合、検証チェックを行いたいと思います。どちらもこれらのソリューションの

は動作:

validates :user_id, User.find(:user_id).admin? 

    before_save :user_is_admin, User.find(self.user_id).admin? 

だから、私の質問があり、私は彼らが管理している場合、ユーザーとのチェックを検索し、エラーをスロー検証を書くのですかそうでない場合?

P.S.私はすでにbefore_actionとしてコントローラの管理者チェックを行っていますが、管理者以外のユーザが何らかの方法で作成して管理していれば、オブジェクトを無効にしたいと思います。

これはベストプラクティスではない場合でも、レールで有効性チェックを作成する方法についてもう少し詳しく知りたいと思います。

答えて

1

私は一般に、このタイプの承認をモデル/データベースレベルで行うことを推奨しません。むしろ、自分の認証コードを自分のレイヤーに抽象化し、コントローラーレベルでこれを処理してから、コントローラーを介する以外の誰もオブジェクトを作成できないことを確認するテストに頼ることをお勧めします。

https://github.com/elabs/punditは、承認レイヤーをRailsアプリケーションに統合するための素晴らしい宝です。アクションがモデルになる前に、私は主に検証し

validate :creator_is_admin 

def creator_is_admin 
    errors[:base] << I18n.t('object_class.activerecord.validations.admin_create_check_failure') unless User.find(user_id).try(:admin?) 
end 
+0

Hmmm。それはモデルでうまくいくように見えます。 "ActiveRecord :: RecordNotFound: 'id' = のユーザーを見つけることができませんでしたapp/models/user/user/post.rb:12: 'creator_is_admin '内 test/models/post_test.rb:17:'ブロック内の' " 私は正しい方法でそれをやっていなければなりません:) – Jeremy

0

、コントローラはそれのために良いことができます:あなたはまだモデルレベルでこの検証を行うにはしたくなかった場合

は、あなたがこのような何かを行うことができます。

###Post Model Sample 

    validate :is_admin? 
    def is_admin? 
    unless User.find_by_id(user_id).admin 
     errors.add(:not_admin, "The post not belongs to you || not admin :) ") 
    end 
    end 
関連する問題