Rails:能力和 ActiveAdmin 未按预期工作
Rails: Ability and ActiveAdmin not working as expected
我正在使用 ActiveAdmin 和 Cancancan 在 Rails 项目上进行 Ruby。我为角色用户定义了一些能力,例如 super_administrator
、administrator
或 subscribers
。
在编写了一些单元测试后,我发现有些功能无法正常工作,而且我无法找出问题所在。
具体来说,我有一个通讯模块,我只想 administrator
或 super_administrator
来管理它。
这是我的能力摘录:
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new # visitor user (not logged in)
alias_action :create, :read, :update, :destroy, to: :crud
if user.super_administrator?
# super_administrator privileges
elsif user.administrator?
# administrator privileges
elsif user.subscriber?
cannot :manage, Newsletter
else
cannot :destroy, :all
cannot :update, :all
cannot :create, :all
cannot :manage, Newsletter
end
end
end
我的测试:
# this test breaks for no reason
test 'should not destroy newsletter if logged in as subscriber' do
sign_in @subscriber
assert_no_difference 'Newsletter.count' do
delete :destroy, id: @newsletter
end
assert_redirected_to admin_dashboard_path
end
private
def initialize_test
@newsletter = newsletters(:one)
@subscriber = users(:alice)
end
这个测试失败了,因为即使我写了订阅者不管理新闻稿的能力,新闻稿也被破坏了。
同样奇怪的是,如果我测试订阅者的能力,一切正常:
# this test pass as expected by ability
test 'should test abilities for subscriber' do
sign_in @subscriber
ability = Ability.new(@subscriber)
assert ability.cannot?(:create, Newsletter.new), 'should not be able to create'
assert ability.cannot?(:read, Newsletter.new), 'should not be able to read'
assert ability.cannot?(:update, Newsletter.new), 'should not be able to update'
assert ability.cannot?(:destroy, Newsletter.new), 'should not be able to destroy'
end
我尝试直接在浏览器中手动测试,但技能也不起作用。
我不明白我错过了什么。有人知道我的代码有什么问题吗?
我的项目:
- Ruby 2.2.2
- Rails 4.2.3
- ActiveAdmin 1.0.0 pre1
- 康康康 1.12.0
经过几个小时的调查,我发现问题出在与 ActiveAdmin 的(具有正确的能力)同名的变量并且正在覆盖它们(具有错误的能力)。
更改我的 ApplicationController 中的变量名称修复了所有 Abilities 错误。
我正在使用 ActiveAdmin 和 Cancancan 在 Rails 项目上进行 Ruby。我为角色用户定义了一些能力,例如 super_administrator
、administrator
或 subscribers
。
在编写了一些单元测试后,我发现有些功能无法正常工作,而且我无法找出问题所在。
具体来说,我有一个通讯模块,我只想 administrator
或 super_administrator
来管理它。
这是我的能力摘录:
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new # visitor user (not logged in)
alias_action :create, :read, :update, :destroy, to: :crud
if user.super_administrator?
# super_administrator privileges
elsif user.administrator?
# administrator privileges
elsif user.subscriber?
cannot :manage, Newsletter
else
cannot :destroy, :all
cannot :update, :all
cannot :create, :all
cannot :manage, Newsletter
end
end
end
我的测试:
# this test breaks for no reason
test 'should not destroy newsletter if logged in as subscriber' do
sign_in @subscriber
assert_no_difference 'Newsletter.count' do
delete :destroy, id: @newsletter
end
assert_redirected_to admin_dashboard_path
end
private
def initialize_test
@newsletter = newsletters(:one)
@subscriber = users(:alice)
end
这个测试失败了,因为即使我写了订阅者不管理新闻稿的能力,新闻稿也被破坏了。
同样奇怪的是,如果我测试订阅者的能力,一切正常:
# this test pass as expected by ability
test 'should test abilities for subscriber' do
sign_in @subscriber
ability = Ability.new(@subscriber)
assert ability.cannot?(:create, Newsletter.new), 'should not be able to create'
assert ability.cannot?(:read, Newsletter.new), 'should not be able to read'
assert ability.cannot?(:update, Newsletter.new), 'should not be able to update'
assert ability.cannot?(:destroy, Newsletter.new), 'should not be able to destroy'
end
我尝试直接在浏览器中手动测试,但技能也不起作用。
我不明白我错过了什么。有人知道我的代码有什么问题吗?
我的项目:
- Ruby 2.2.2
- Rails 4.2.3
- ActiveAdmin 1.0.0 pre1
- 康康康 1.12.0
经过几个小时的调查,我发现问题出在与 ActiveAdmin 的(具有正确的能力)同名的变量并且正在覆盖它们(具有错误的能力)。
更改我的 ApplicationController 中的变量名称修复了所有 Abilities 错误。