如何让我的ability.rb正常工作以进行索引操作?

时间:2016-03-04 23:27:42

标签: ruby-on-rails ruby ruby-on-rails-4 cancan cancancan

这就是我ability.rb的样子:

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)
    if user.has_role? :admin
      can :manage, :all
    end

    can :manage, Connection, inviter_user_id: user.id

  end
end

在我的控制器中我有这个:

class ConnectionsController < ApplicationController
  load_and_authorize_resource
  skip_authorize_resource only: :index

  layout 'connections'

  def index
     @family_tree = current_user.family_tree
     @inviter_connections = current_user.inviter_connections.order("updated_at desc")
     @invited_connections = current_user.invited_connections.order("updated_at desc")
  end
end

在我的application_controller.rb中,我有这个:

  rescue_from CanCan::AccessDenied do |exception|
    redirect_to authenticated_root_url, :alert => exception.message
  end

然而,当我在未登录时尝试访问/connections时,我收到此错误:

NoMethodError at /connections
undefined method `family_tree' for nil:NilClass

此外,当我从can :manage, Connection中移除ability.rb时,它实际上会将我发送到我的登录页面。

如何兼顾两者?

3 个答案:

答案 0 :(得分:1)

看起来您正在使用Devise进行身份验证。对于使用设计时的这种验证,您应该将其添加到控制器中:

before_action :authenticate_user!

答案 1 :(得分:0)

尝试以下方法:

Cannot cast from AlertDialog.Builder to Dialog
The method findViewById(int) is undefined for the type AlertDialog.Builder

另外,注意到你只是skip_authorize_resource :: index,试着注释掉它,看看它是否有效。

答案 2 :(得分:0)

在您的控制器的第8行,当您未登录时,current_user为零,并且正在呼叫family_tree

你需要类似的东西(仅作为一个例子,它取决于你的需要):

 @family_tree = current_user.try(:family_tree) || FamilyTree.new

删除Ability中的行时“工作”的原因是因为这会删除查看连接的功能,因此before_filter会在您进入index之前重定向。可能绊倒你的是Connection记录inviter_user_id nilUser#idnil,因此它允许你进入{index 1}}。