在Rails中设计无范围的授权

时间:2014-07-25 11:33:16

标签: ruby-on-rails devise authorization

我有一个这样的模型:

class Engineer < ActiveRecord::Base
  default_scope { is_published }
  scope :is_published, -> { where(is_published: true) }
end

可以通过GitHub在网站上授权工程师。而且我希望能够在网站上为未发布的工程师授权。某些控制器中有这样的过滤器:

before_action :authenticate_engineer!, only: [:show]

但是现在成功授权工程师仍然无法通过这些过滤器。怎么说设计他应该在无范围的工程师之间搜索?想想,我应该覆盖一些Devise方法...

2 个答案:

答案 0 :(得分:2)

解决方法是在Engineer.rb中重写此Devise方法:

def self.serialize_from_session(key, salt)
  Engineer.unscoped {super}
end

答案 1 :(得分:0)

如果我正确理解你,你想要:

  • 经过验证的工程师能够查看未发表的工程师
  • 未经过身份验证的工程师无法查看

请勿使用默认范围,而是执行以下操作:

# engineer.rb
class Engineer < ActiveRecord::Base
  scope :published, -> { where(is_published: true) }
end

在你的控制器中:

# engineers_controller.rb
def show
  @engineers = engineer_signed_in? ? Engineer.all : Engineer.published
end

基本上,您要向经过身份验证的工程师展示所有工程师,而对于那些未使用Devise登录的工程师,只展示已发布的工程师。