这就是我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
时,它实际上会将我发送到我的登录页面。
如何兼顾两者?
答案 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
nil
,User#id
是nil
,因此它允许你进入{index
1}}。