Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 过滤器前的导轨_Ruby On Rails_Devise - Fatal编程技术网

Ruby on rails 过滤器前的导轨

Ruby on rails 过滤器前的导轨,ruby-on-rails,devise,Ruby On Rails,Devise,请帮助我解决此问题: 我有两个设计模型(用户和管理员) 我有一些带有路线的post模型和控制器: /posts /posts/80 /posts/80/edit 我希望: 管理员拥有所有访问权限 用户有权访问: /post and /post/80 ( if he is creator of this post ) 我这样做: class PostsController < ApplicationController before_filter :ch

请帮助我解决此问题:

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

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

/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
并且他可以访问(即使他不是这篇文章的创建者)

如何解决此问题?

我想要那样的东西 私人的

    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

但是它不起作用

我的建议是使用坎坎宝石

这是一个很棒的火车司机

有了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

我的建议是使用坎坎宝石

这是一个很棒的火车司机

有了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

代码的根本问题是,您只检查用户是否登录,而不是他们是否是该帖子的所有者。您需要在posts表中设置account_id列,您只需执行before筛选并检查当前用户是否与posts所有者相同,但cancan确实是一个更好的选择,因为它易于配置并保持代码干燥代码的基本问题是,您只需检查用户是否登录,如果他们是那篇文章的主人,那就不是了。您需要在posts表中设置account\u id列,您只需执行before筛选并检查当前用户是否与posts所有者相同,但cancan确实是一个更好的选择,因为它易于配置并保持代码干燥