我在我的控制器中设置了这些before_action
:
before_action :require_user, unless: :public?, only: [:show]
before_action :require_user, only: [:index, :edit, :update]
字符串
基本上,我只在public?
为false时才尝试在show
操作中执行过滤器required_front_user
。
对于其余的动作,我希望始终执行过滤器。
看起来第一个before_action
设置被第二个设置忽略并完全覆盖。
是否可以使用before_action
语句将这两种组合合并组合起来,或者我必须在过滤器本身中实现这种逻辑?
更新
这也不起作用:
before_action :require_user, if: :public?, only: [:index, :edit, :update]
before_action :require_user, unless: :public?, only: [:show, :index, :edit, :update]
型
我想如果public?
返回true
,第一个设置将被加载,如果false
,第二个设置将被加载。碰巧只有第二个设置被加载,如果public? == true
,before_action
永远不会被触发
更新2
这是我发现它的工作原理:
before_action :require_user_when_public, if: :public?, only: [:index, :edit, :update]
before_action :require_user_when_no_public, unless: :public?, only: [:show, :index, :edit, :update]
protected
def require_user_when_public
require_user
end
def require_user_when_no_public
require_user
end
型
这是非常丑陋的:
4条答案
按热度按时间ig9co6j11#
字符串
pod7payv2#
我发现的最简单的方法是:
字符串
disho6za3#
我只测试了一点点,所以不太确定它会工作,但也许是这样的:
字符串
作为一个可能愚蠢/破碎的(据我所知,这似乎在我的基本测试中起作用)替代方案,可能是这样的:
型
xmd2e60i4#
如何将条件移动到方法体(和名称)?
字符串
最好使用
except
:型