2013-10-13 27 views
6

我有一个Events控制器,我想在该事件公开时跳过身份验证。有条件地将skip_before_filter应用于:if => condition in rails 4

在我ApplicationController我有这样的呼吁制定的authenticate_user!

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

现在,在我的活动表,我有一个布尔字段名为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. 这是否有任何性能影响。如果是,那么有更好的方法吗?
+1

在代码的第二块,你忘了有目的的问号? 'Proc.new {:is_public}' – Damien

+0

没有。我实际上无法得到这个':if => conditonal'来工作,所以不知道它应该是':is_pulic?'还是':is_public' – CuriousMind

+0

如果你有一个'public'字段,它可以是'公共“还是”公共?“。如果你想使用它,请将'is_public?'方法移到你的'Event'模型中。 – Damien

回答

6

有关回调的rails文档(之前,之后,周围的动作)实际上很糟糕。看到这个类似的问题:skip_before_filter ignores conditionals

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

我不完全相信,这将与跳过滤器一起工作,但它是值得一试。

只需调用不同的过滤器就不会影响性能。性能问题通常来自广泛的数据库查询或其他外部系统调用。这里

我最关心的是,这是相当困难的理解,为什么有这么多的东西before_action回事...