11

我有一个Events控制器,如果事件是公开的,我想在其上跳过身份验证。

在我的ApplicationController我有这个要求设计的电话authenticate_user!

class ApplicationController < ActionController::Base
  before_action :authenticate_user!
end

现在,在我的 Events 表中,我有一个名为public. 我用它来检查事件是否公开。像这样在EventsController

class EventsController < ApplicationController
  skip_before_action :authenticate_user!, only: :show, if: Proc.new { :is_public? }
end

但由于某种原因,这不起作用。所以我不得不这样做:

class EventsController < ApplicationController
  skip_before_action :authenticate_user!, only: :show
  before_action :authenticate_user!, unless: :is_public?

  def is_public?
    @event.present? && @event.is_public
  end
end

这可以按预期工作并跳过身份验证,如果@event.public = true因为上面before_filter在跳过后重复了相反的条件。

我想知道:

  1. 我所做的是正确的吗?
  2. 这是否对性能有任何影响。如果是,那么有没有更好的方法?
4

1 回答 1

9

关于回调(之前,之后,围绕行动)的rails文档实际上非常糟糕。看到这个类似的问题:skip_before_filter ignores conditionals

所以我总是参考导轨指南。你会感兴趣的部分在这里: http: //guides.rubyonrails.org/action_controller_overview.html#other-ways-to-use-filters

我不完全确定这也适用于跳过过滤器,但值得一试。

仅仅通过调用不同的过滤器不应该对性能产生影响。性能问题通常来自广泛的数据库查询或其他外部系统调用。

我主要担心的是很难理解为什么会有这么多 before_action 事情发生......

于 2013-10-13T14:51:30.523 回答