Rails resource_controller有中断吗?

时间:2009-08-31 09:53:53

标签: ruby-on-rails

我想使用before操作来选择中断处理,如果它不符合某些条件(例如,对象不是由这样的用户拥有等)

我需要使用它,因为我有一个更复杂的场景 需要在访问权限之前加载对象 确定了,所以我会遇到我想要中断的情况 如果它是无效访问的行动,无论如何我可以做到这一点?

4 个答案:

答案 0 :(得分:1)

好的,这是我在使用RC时想到的。

通常的RC行动类似于:

def show
  load_object
  before :show
  response_for :show
rescue ActiveRecord::RecordNotFound
  response_for :show_fails
end

所以假设你想在load_object之后中断show,如果某些条件失败的话。

我能想到的最好的方法(修改RC :)除外:

  • 使用 before_filter 检查条件
  • before_filter 中使用对象集合帮助程序(根据操作)。这样,RC操作实现中的 load_object / load_collection 将使用从您使用帮助程序缓存的相同值,因此不会进行额外的查询。

答案 1 :(得分:0)

假设您指的是before_filter

任何renderredirect调用都应该中止过滤器链并执行操作。因此,只需将访问控制过滤器放在加载“东西”之后,然后呈现错误消息(使用适当的状态代码以获得良好的Web业力并防止w3c击败)。

这只是另一个铁轨区域,只要你不太认真就可以正常工作。

任何帮助还是我错过了这一点?

答案 2 :(得分:0)

维塔利的方法可能是正确的,但我也有一个有趣的过度设计方法,所以作为参考发布:

  1. 使用around_filter
  2. 在before hook中,抛出AccessDeniedException
  3. 捕获周围过滤器中的异常
  4. 那也可以完成这项工作。

答案 3 :(得分:0)

如果您发现自己经常编写before_filters进行前置条件检查,您可能会发现Aegis有用。它允许您在单个文件中定义访问规则,以便您可以一目了然地查看可以访问的内容。

它也是为了与resource_controller轻松集成而构建的。