如何使用Ruby on Rails方法执行?在if else声明中?
我尝试在下面的示例中使用此StackOverflow anwser:
if condition
does something
elsif redirect_to(records_path)
performed?
does another thing
else
yet another thing
end
但是这只会在不检查是否执行的情况下重定向。
我希望它检查是否执行了重定向到records_path以及何时执行了某些操作(或者#34;做了另一件事"在我的示例中)
我也试过这个:
elseif records_path.performed?
而且:
elseif redirect_to(records_path) performed?()
介于两者之间的所有事情。
有人可以解释它是如何完成的以及我如何从docs获得它?
答案 0 :(得分:1)
这意味着你的控制器动作(A)能够调用其他控制器方法(M),然后只有当(M)都没有执行渲染/重定向时才在(A)中渲染或重定向。
阅读源代码,它非常简单明了:https://apidock.com/rails/ActionController/Metal/performed%3F
例如:
class ArticlesController < ApplicationController
def show
check_identity
render :show unless performed?
end
def check_identity
redirect_to root_path, notice: "You're not allowed to be here" unless user_signed_in?
end
end
答案 1 :(得分:1)
performed?
只测试渲染或重定向是否已经发生。这不会检查发送给用户的视图。只检查“您自己定义路径或必须自动完成”。
尝试这样的事情:
if condition
does something
redirect_to(records_path)
end
if performed?
does another thing
else
yet another thing
end
答案 2 :(得分:0)
在控制器操作中,当我们键入render
或redirect_to
时,它们不会立即执行,但它们会排队并在完成方法后执行。因此,这允许在控制器操作中具有双重渲染或redirect_to,这将产生错误(因为那时rails不知道要执行哪个)。这就是为什么在rails中他们添加了一个方法performed?
,它将指示是否已经调用render
或redirect_to
(排队)。
在大多数情况下,这并不是真的需要,因为通常你的控制器代码非常简单。
澄清一下:performed?
实际上并没有测试redirect_to
已经完成,只是测试渲染或重定向到被调用/排队。此外,redirect_to
不返回指示是否已完成的布尔值。
所以你的代码应该是这样的:
if condition
does something
else
redirect_to(records_path)
end
if performed?
# the redirect-to was executed
does another thing # but not a render or redirect
else
yet another thing
# and could be a render or redirect
# if not the normal view will be rendered
end
请注意,在这个简单示例中,performed?
只是condition
的否定因此,您可以轻松地将它们压缩在一起。