rails 新手,准备做一个校园旧书交易系统。暂时简单学了 rails 的 CRUD 操作和用户的注册和登录功能,目前的困难是实现一个用户的权限问题:用户只能对自己上架的旧书进行更改很删除操作。希望得到指导,非常感谢您的任何建议。。(^__^) ……
用这个 gem https://github.com/elabs/pundit
@book = Book.find(params[:id])
authorize @book, :update?
#5 楼 @cqcn1991 看一下pundit
的 README,在不使用scope
的情况下,就是一个很纯粹的 class,逻辑很很简单。
class PostPolicy
attr_reader :user, :post
def initialize(user, post)
@user = user
@post = post
end
def update?
user.admin? or not post.published?
end
end
可以直接通过 PostPolicy.new(current_user, @post).update?
来做权限判断。
pundit
就是在上面的逻辑上再包装了一层 controller\view 的 helper 方法。
@solopiggy 如果你有一天时间,建议使用 cancancan,自此以后不会被权限问题困扰,项目不论大小,不论复杂程度,最多一小时可以设定好。
cancan 不维护了,现在是社区版 cancancan
基础:当然可以看 github 官方帮助,但 xdite 讲得相当好: http://blog.xdite.net/posts/2012/07/30/cancan-rule-engine-authorization-based-library-1/ http://blog.xdite.net/posts/2012/07/30/cancan-rule-engine-authorization-based-library-2/ http://blog.xdite.net/posts/2012/07/30/cancan-rule-engine-authorization-based-library-3/
把权限定义放在数据库,这样以后要添加权限,不用改代码,直接在数据库就可以搞定: https://ruby-china.org/topics/5938
这是我做的项目,按 Readme 可以在 heroku 跑起来,你就知道在管理后台设定用户权限是多么简单方便的一件事: https://github.com/ZPVIP/church/
权限定义文件: https://github.com/ZPVIP/church/blob/master/app/models/ability.rb
View:
if can? :read, Contact
之类的:
https://github.com/ZPVIP/church/blob/master/app/views/layouts/application.html.erb
Model: https://github.com/ZPVIP/church/blob/master/app/models/user.rb https://github.com/ZPVIP/church/blob/master/app/models/permission.rb https://github.com/ZPVIP/church/blob/master/app/models/user_permission.rb
#11 楼 @peter 正在用你回复的这种方式给用户加权限,可是在 user 的 form 中用到<%= f.assciation :permissions, :as => 'check_boxes' %>时报错 undefinded method 'assciation' for #SimpleForm::FormBuilder:0xbcf548dc这是为什么呢?