Ruby on rails Rails:功能和ActiveAdmin未按预期工作

Ruby on rails Rails:功能和ActiveAdmin未按预期工作,ruby-on-rails,activeadmin,cancancan,Ruby On Rails,Activeadmin,Cancancan,我正在使用ActiveAdmin和Cancancan开发一个RubyonRails项目。我为角色用户定义了一些功能,如超级管理员、管理员或订阅者 在写了一些单元测试之后,我发现了一些能力不能正常工作,我无法找出哪里出了问题 具体来说,我有一个时事通讯模块,我只需要administrator或super\u administrator来管理它 这是我的能力摘录: class Ability include CanCan::Ability def initialize(user)

我正在使用ActiveAdmin和Cancancan开发一个RubyonRails项目。我为角色用户定义了一些功能,如
超级管理员
管理员
订阅者

在写了一些单元测试之后,我发现了一些能力不能正常工作,我无法找出哪里出了问题

具体来说,我有一个时事通讯模块,我只需要
administrator
super\u 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
我的测试

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 
我试图直接在浏览器中手动测试,但功能也不起作用

我不明白我错过了什么。有人知道我的代码出了什么问题吗

我的项目

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
  • Ruby 2.2.2
  • 轨道4.2.3
  • ActiveAdmin 1.0.0 pre1
  • 坎坎坎1.12.0

经过数小时的调查,我发现问题来自与ActiveAdmin one同名的变量(具有正确的能力),并且正在覆盖它们(具有不好的能力)。

在我的ApplicationController中更改变量名称修复了所有与能力有关的错误。

你能发布完整的代码还是从构造函数中的能力类分支出来?我更新了我的第一个问题,添加了访问者的能力。我精确地调试了一些功能,将一些
记录器。debug
消息放在订户部分,它们出现在终端中,这意味着用户和角色已正确设置,但未应用。