【译】使用范围访问

Saturday, July 24, 2010

原文:http://rails-bestpractices.com/posts/3-use-scope-access

你可以使用范围访问来避免在控制器中检查对象的所有者是否属于当前用户

丑陋的...

class PostsController < ApplicationController
  def edit
    @post = Post.find(params[:id])
    if @post.user != current_user
      flash[:warning] = 'Access denied'
      redirect_to posts_url
    end
  end
end

在这个例子中, 我们对文章的所有者和当前用户作比较,如果条件表达式结果为假, 那么就不允许当前用户去编辑这篇文章,这样为edit,
update, destroy等等做权限检查真的是太丑了,让我们用范围访问来重构吧。

重构...

class PostsController < ApplicationController
  def edit
    # raise RecordNotFound exception (404 error) if not found
    @post = current_user.posts.find(params[:id])
  end
end

这样我们我们只在用户的文章(current_user.posts)里去find,
这样的文章就无需判断就允许用户完全控制。如果没有找到我们给它个华丽丽的404, 呵呵 我们不需要对对象的所有者与当前用户作比较,
只要使用范围访问就可以使得权限检查变得简单.

This entry was tagged Rails and Best-Practices

comments powered by Disqus

© 2009-2013 lxneng.com. All rights reserved. Powered by Pyramid

go to Top