Rails CanCan Hash条件不起作用

时间:2011-10-24 00:34:13

标签: ruby-on-rails ruby-on-rails-3 cancan

我有一个简单的Ability.rb设置如下:

if user.role? :super_admin
  can :manage, :all
elsif user.role? :registered
  can :review, [Card, Deck], :visible => true
end

alias :review => :index, :list, :show, :to的位置。 Card和Deck表都具有带有布尔选项的可见列。目前,表中的每个对象都有:visible => false。因此,我期望具有注册角色的用户将无法:review任何对象,但事实并非如此。控制器级别的限制工作正常(编辑和删除不可访问),但我似乎无法使用条件的哈希来限制资源的查看。有什么想法吗?

编辑:我在两个控制器中有authorize_resource。使用Ruby 1.9.2,Rails 3.1和CanCan 1.6.7。我正在使用设计1.4.9进行身份验证。 MySQL是数据库。

编辑: 嗯..我想出了一种根据条件限制资源的方法。尽管我在所有控制器中都有authorize_resource(并且它可以限制对方法的访问),但我必须将authorize!添加到我想限制资源的方法中。例如,要限制条件为:visible => true的Decks的show动作,我必须添加authorize!

def show
  @deck = Deck.find(params[:deck_id]
  authorize! :review, @deck
end

说实话,我对这个解决方案不满意,因为我没有看到authorize_resource不起作用的原因。我很乐意看到解释。​​

3 个答案:

答案 0 :(得分:1)

也许你可以看到这个主题: Cancan condition

我和你有同样的问题,我通过那个话题来解决它, 我将authorize_resource替换为load_and_authorize_resource

答案 1 :(得分:0)

嗯,重启服务器?你的代码对我来说很好。

答案 2 :(得分:0)

你在打电话吗

load_resource_authorize_resource 

在您的控制器中就像那样,或者您是否包含要授权的模型?

我发现如果输入类似的内容,我可以复制您的问题:

load_resource_authorize_resource Deck

我认为后者不起作用的原因是因为你要求CanCan任意授权“Deck”,而不是授权控制器动作,这是你真正想做的事情。