首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在定义CanCan能力时调用模型方法?

如何在定义CanCan能力时调用模型方法?
EN

Stack Overflow用户
提问于 2011-02-13 21:16:58
回答 1查看 855关注 0票数 1

我在使用CanCan功能模型上定义的方法时遇到了问题:

模型

代码语言:javascript
运行
复制
def Car
    def can_paint?
        ..some conditions, return true or false..
    end
end

能力

代码语言:javascript
运行
复制
can :paint, Car, :user_id => user.id, Car.can_paint?

CarsController

代码语言:javascript
运行
复制
def paint
    @car = ..find the car..
    return redirect_to jobs_path unless can? :paint, @car
    ...
end

当调用画图操作时发生错误。

代码语言:javascript
运行
复制
/.../app/models/ability.rb:11: syntax error, unexpected '\n', expecting tASSOC 
#error points to the line in ability defined above

如果我从能力中删除了Car.can_paint?,那么就没有错误。

问题:

如何在abilities?

  • When中使用can_paint?定义功能,没有办法访问为模型找到的实际实例,即@car,而不必使用Car,这样我就可以编写:

can :paint, Car, :user_id => user.id ***if @car.can_paint?***

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-13 21:42:52

can方法接受要检查的条件的散列。在您的示例中,当您调用它时:

代码语言:javascript
运行
复制
can :paint, Car, :user_id => user.id, Car.can_paint?

它实际上是在传递以下内容:

代码语言:javascript
运行
复制
can :paint, Car, {:user_id => user.id, true}

这不是一个有效的散列,很可能是expecting tASSOC错误的来源。(您还在类上调用实例方法,但这不是真正的问题)

但是,您可以将块作为条件传递,因此,下面这样的内容将用于检查实际对象:

代码语言:javascript
运行
复制
can :paint, Car, :user_id => user.id do |car|
  car.can_paint?
end

这将正确地检查用户是否拥有绘制汽车实例的权限。

作为参考,请留意CanCan的文档,因为它们提供了一些非常好的示例- https://github.com/ryanb/cancan/wiki/Defining-Abilities

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4986922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档