0

問題を解決するのを手伝ってください:

私は2つのデバイスモデル(ユーザーと管理者)を持っています

そして、私はルートを持ついくつかのポストモデルとコントローラを持っています:

/posts
/posts/80
/posts/80/edit

そして私はそれが欲しい:管理者はユーザーがアクセスできるすべてのアクセス権を持っています:

/post
   and 
/post/80 ( if he is creator of this post ) 

私はこれをしました:

    class PostsController < ApplicationController
        before_filter :check_guest_logged_in!, :except => [:index, :show]

.
.
.
    private

    def check_guest_logged_in! 
      if user_signed_in?
        authenticate_user!  

      elsif admin_signed_in?
        authenticate_admin!
      else
        redirect_to root_path
      end   
    end

ただし、この場合、ユーザーが承認されている場合、彼はブラウザに入れることができます

/posts/80/edit

そして彼はアクセス権を取得します(彼がこの投稿の作成者でなくても)

どうすればこれを修正できますか?

私はそのプライベートのようなものが欲しい

    def check_guest_logged_in! 
      if user_signed_in?
        authenticate_user!

    if ( current_user.id == @post.user.id ) 
    else
      return false;
    end     

      elsif admin_signed_in?
        authenticate_admin!
      else
        redirect_to root_path
      end   
    end

しかし、それはうまくいきません

4

1 に答える 1

3

私の提案は、CanCan gemを使用することです

https://github.com/ryanb/cancan

ここに優れたレールキャストがあります

http://railscasts.com/episodes/192-authorization-with-cancan

cancanを使用すると、このようなことができます

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)
    if user.admin?
      can :manage, :all
    else
      can :read, :all
    end
  end
end
于 2012-09-13T22:43:00.287 に答える