1

我的一个控制器有近 100 种方法(例如路由),如果 id 参数无效,几乎每个控制器都从相同的代码开始重定向到错误页面,然后类似的检查该 id 的用户是否不属于用户帐户:

def something
  @foo = Foo.find_by_guid(params[:id])
  unless @foo
    @msg ||= { :title => 'No such page!',
      :desc => "There is no such page!" }
    render :action => "error" and return
  end
  unless @foo.owner_id == current_user.id
   @msg ||= { :title => 'Really?',
      :desc => "There is no such page." }
    render :action => "error" and return
  end

考虑到代码正在渲染……然后返回,那么干掉那种页面 id 和所有者 id 验证的最佳方法是什么?

在这一点上我不想做的是将它卸载到像 CanCan 这样的黑盒角色和权限库......我的目标只是让应用内代码尽可能干净地处理这个问题。

4

2 回答 2

4

听起来你需要一个前置过滤器:

class MegaController < ActionController::Base
    before_filter :grab_and_check_foo
    #...
private
    def grab_and_check_foo
        @foo = Foo.find_by_guid(params[:id])
        if !@foo
            #... render some error stuff
        end
        if @foo.owner_id != current_user.id
            #... render some other error stuff
        end
    end
end

前置过滤器可以通过重定向或渲染某些东西来突破通常的控制器进程,因此这不是问题。

于 2012-09-30T03:35:04.900 回答
1

您可以有一个前置过滤器来检查所有权并根据检查呈现或重定向

于 2012-09-30T03:34:50.450 回答