Rails + Devise:如何限制用户编辑不属于他的记录

sev*_*ens 2 ruby-on-rails devise ruby-on-rails-3

我正在使用Rails,Devise和Mongoid.

用户只能拥有一个项目(has_one :profile),但所有用户(以及未经过身份验证的用户)都可以看到项目列表(我有这个工作).当用户登录时,他们会看到项目旁边的"编辑和删除"按钮(通过将这些按钮包装在其中<% if user_signed_in? %>).但是,登录用户会看到所有项目旁边的这些按钮,并且可以编辑或删除它们.

如何限制登录用户只能编辑他的项目?

作为奖励,是否可以在属于登录用户的项目周围显示特定内容或html(例如,"这是您的项目"的文本或项目的html附加类)?

Vic*_*ash 6

当多个用户能够修改相同的资源时,CanCan非常棒,您需要跟踪谁拥有哪些权限.但是,如果严格的情况是只有拥有该项目的用户才能对其进行修改,那么CanCan可能就是矫枉过正.

按照iouri的建议隐藏视图中的链接,然后在控制器中执行以下操作:

def edit
  if current_user != @project.user
    # Redirect them to an error page
  else
    # Render the view
  end
end
Run Code Online (Sandbox Code Playgroud)

更好的是,创建一个方法,如:

def user_owns_project?
  @project.user == current_user
end
Run Code Online (Sandbox Code Playgroud)

然后设置一个前置过滤器进行编辑,更新和销毁,以便在用户不拥有项目时重定向到错误页面.

编辑:你之前的过滤器也将找到项目和设置@project.CanCan也可以为您解决这个问题load_and_authorize_resource,但我仍然会避免使用它,除非您需要或期望需要细粒度的权限控制.