如何根据用户角色限制返回的记录?

时间:2011-01-06 09:48:31

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

我有一个我正在研究的Rails 3网站,其用户使用“文档”进行操作。

如果每个文档都有user_id,那么对于我的文档控制器中的编辑方法,我可以将结果限制为当前用户拥有的文档,如下所示:

@doc = current_user.documents.find(params[:id])
respond_with(@doc)

不幸的是,事情并非那么简单。每个用户都可以通过中间“订阅”与文档建立关系 - 他们可以是所有者,编辑或读者。

现在,在我的编辑方法中,我希望能够将检索到的文档限制为所有者或编辑者。我该怎么做呢?目前我的文档模型中有一个范围,如:

scope :editable_by, lambda { |user| joins(:subscriptions).where("user_id = ? AND (subscriptions.role = ? OR subscriptions.role = ?)", user.id, Subscription::ROLES['owner'], Subscription::ROLES['editor']) }

这样我就可以进入我的编辑方法了:

@doc = Document.editable_by(current_user).find(params[:id])

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

我认为你找不到更好的方法。例如,我倾向于使用CanCan进行授权,如果您的模型具有指示访问权限的属性(例如owner_id),则仅提供内置辅助方法。

否则,您仍需要在模型上实现范围或方法。因此,除非我弄错了,否则你很难找到比现在更好的方式。