每次用户调用该操作时,如何在Ruby on Rails中检查Cancancan中的授权?

时间:2016-08-07 14:41:11

标签: ruby-on-rails controller authorization cancancan

我正在使用Ruby on Rails 5,我希望根据用户的角色,用户可以发布5个帖子或10个或15个,这只是我必须检查的几种可能情况的一部分对于授权(对于非Posts的东西,例如我有其他更复杂的情况),所以几天前我开始使用Cancancan(v 1.15.0),不要让User模型太大,所以这个方式我为每个角色和ability.rb都有一个类我只是根据角色合并类。

问题是使用Cancancan显然只检查一次授权。例如在创建帖子中,在Post#创建第一行代码是:

authorize! :create, Post

在用户的Role类中,我有以下代码:

  if user.posts.size < 10
    Rails.logger.debug "If-size: #{user.posts.size}"
    can :create, Post
  else
    Rails.logger.debug "Else-size: #{user.posts.size}"
    cannot :create, Post
  end

我在RSpec上进行了一些测试,我看到第一次使用控制器创建Post的current_user(具有该特定角色的那个)(我的意思是,不是通过FactoryGirl或任何其他不使用控制器的方式),它出现在log / test.log中:

If-size: 0

但是,无论是Else还是If都没有出现在日志中,控制器创建了多少帖子并不重要,它只是第一次评估这个条件而用户被授权创建尽可能多的帖子。他想要的是因为第一次If中的条件为真,并且每次调用控制器Post的方法创建时都不会对它进行评估。

编辑:通过MarsAtomic建议的方法解决。谢谢! :)

1 个答案:

答案 0 :(得分:0)

CanCanCan无意根据应用程序中的条件动态评估角色。这种类型的功能最好由应用程序自己的逻辑处理,而不是授权工具。

您应该考虑在roles表中添加一列,以指示允许特定角色的帖子数量。此列允许您检查每个用户(通过角色)可以创建的帖子数量。

然后,在posts_controller.rb中,您可以将帖子创建逻辑包装在仅在用户未超过允许的最大帖子数时运行的块中:

def create
  if user.posts.size < user.role.max_posts
    @post = Post.new(post_params)

    @post.save
    redirect_to @post
  else
    # flash an error on the page or redirect to an error page
  end
end