如果before_action返回false,如何执行一个操作

19
我知道下面的代码:

before_action :signed_in?, only: [:new]

如果signed_in?返回true,那么将执行new操作,但是如果我想让signed_in?返回false时执行new操作,我该怎么做呢?我需要创建一个新的方法,比如not_signed_in?吗?

这是我的signed_in?方法

def signed_in?
  !@current_user.nil?
end

你确定如果 signed_in? 返回 false 它就不会运行吗?为什么会这样呢? - Marek Lipka
before_action 的目的是什么?它是用来阻止一个动作执行,如果它返回 false 吗? - zer0uno
不是的。它的目的是在你的方法执行之前准备一些东西。 - Rails Guy
不,据我所知,这只是新的 before_filter 名称。 - Marek Lipka
你能粘贴一下你的signed_in?方法吗?或者这是一个默认的devise方法吗? - Rails Guy
3个回答

32

before_action 不像你想的那样工作 - 如果回调函数返回 false,它并不能阻止 action 被执行。

我会用稍微不同的方法来解决你的问题,例如:

before_action :redirect_to_root, :if => :signed_in?, :only => :new

# ...
private
def redirect_to_root
  redirect_to root_path
end

没错,谢谢。 附言:向雅各布·亚尔布佐夫斯基问好!;) - zer0uno
@antox 哈哈,你怎么认识Jakub的?你怎么知道我也认识他? :) Facebook?:P - Marek Lipka
FB 知道一切! :) 我怎么认识他?嗯,这是一个漫长的故事,也许他可以告诉你。 - zer0uno

8
before_action :new, unless: -> { signed_in? }

虽然我认为在调用的操作中重定向更好,但是这句话需要翻译。
def your_action_called
  redirect_to :new unless signed_in?
  [...code ...]
end

0
如果你想使用 before_action :signed_in? 来覆盖除了 new action 以外的所有其他方法,最好使用 :except 而不是 :only,像这样:
before_action :signed_in?, except: :new

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接