如何使用Rails实例public方法执行?在 if-else 中

How to use Rails instance public method performed? in if-else

如何使用Ruby on Rails方法执行?在 if else 语句中?

我尝试在下面的示例中使用这个 Whosebug anwser

if condition
  does something
elsif redirect_to(records_path)
  performed?
  does another thing
else
  yet another thing
end

但这只是重定向而不检查是否执行。

我希望它检查是否执行了到 records_path 的重定向以及何时执行某些操作(或在我的示例中为 "does another thing")

我也试过这个:

elseif records_path.performed?

还有这个:

elseif redirect_to(records_path) performed?()

以及介于两者之间的所有事情。

谁能解释一下它是如何完成的以及我如何从 docs 得到它?

这意味着您的控制器操作 (A) 能够调用其他控制器方法 (M),然后仅当 (M) 的 none 执行了 render/redirect.

阅读源代码,非常简单明了: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

performed? 只是测试渲染或重定向是否已经发生。这不会检查发送给用户的视图。该检查仅 "you define path yourself or it must be done automatically".

尝试这样的事情:

if condition
  does something
  redirect_to(records_path)
end
if performed?
  does another thing
else
  yet another thing
end

在控制器操作中,当我们键入 renderredirect_to 时,它们不会立即执行,但它们会排队并在方法完成后执行。所以这允许在控制器操作中有双重渲染或 redirect_to,这将产生一个错误(因为 rails 不知道要执行哪个)。所以这就是为什么在 rails 中他们添加了一个方法 performed?,它将指示 renderredirect_to 是否已经被调用(排队)。

在大多数情况下,这并不是真正需要的,因为通常您的控制器代码非常简单。

澄清一下:performed? 并没有实际测试 redirect_to 已经完成,它只是测试渲染或重定向到 called/queued。此外,redirect_to 不是 return 指示是否已完成的布尔值。

所以你的代码应该是这样的:

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 的负数,因此您可以轻松地将它们压缩在一起。