ruby 使用不同条件的Rails和before_action

eni9jsuy  于 2024-01-07  发布在  Ruby
关注(0)|答案(4)|浏览(127)

我在我的控制器中设置了这些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? == truebefore_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


这是非常丑陋的:

ig9co6j1

ig9co6j11#

before_action :require_user, only: require_user_before_actions

private

def require_user_before_actions
 actions = [:index, :edit, :update]
 actions << :show unless public?
 actions
end

字符串

pod7payv

pod7payv2#

我发现的最简单的方法是:

before_action :require_user, only: [:index, :edit, :update]
before_action :require_user_when_no_public, unless: :public?, only: [:show]

protected 

def require_user_when_no_public
  require_user
end

字符串

disho6za

disho6za3#

我只测试了一点点,所以不太确定它会工作,但也许是这样的:

before_action :require_user, if: ->(c) {
  [:index, :edit, :update, !public? && :show].include?(c.action_name.to_sym)
}

字符串
作为一个可能愚蠢/破碎的(据我所知,这似乎在我的基本测试中起作用)替代方案,可能是这样的:

class <<self
  alias_method :old_before_action, :before_action
end

def self.before_action(*callbacks)
  options = callbacks.extract_options!
  if options[:only] && options[:only].is_a?(Proc)
    only_proc = options.delete(:only)
    if_proc = ->(c) { Array(only_proc.(c)).reject(&:blank?).map(&:to_s).to_set.include? c.action_name }
    options[:if] = Array(options[:if]).unshift(if_proc)
  end
  old_before_action(*callbacks, options)
end

before_action :require_user, only: ->(c) { [:index, :edit, :update, !public? && :show] }

xmd2e60i

xmd2e60i4#

如何将条件移动到方法体(和名称)?

before_action :require_user, only: [:index, :edit, :update]
before_action :require_user_unless_public, only: [:show]

private

def require_user_unless_public
  require_user unless public?
end

字符串
最好使用except

before_action :require_user, except: [:show]
before_action :require_user_unless_public, only: [:show]

相关问题