Rails before_filter

时间:2012-09-13 20:40:45

标签: ruby-on-rails devise

帮助我解决问题:

我有两个设计模型(用户和管理员)

我有一些模型和控制器的路线:

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

我希望如此: admin拥有所有访问权限 用户有权访问:

/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

但它不起作用

1 个答案:

答案 0 :(得分:3)

我的建议是使用CanCan gem

https://github.com/ryanb/cancan

这是一个很棒的railscast

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