2

如何使用 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 的重定向以及何时执行某项操作(或在我的示例中为“执行另一项操作”)

我也试过这个:

elseif records_path.performed?

和这个:

elseif redirect_to(records_path) performed?()

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

有人可以解释它是如何完成的以及我如何从文档中获得它吗?

4

3 回答 3

2

performed?只是测试渲染或重定向是否已经发生。这不会检查发送给用户的视图。该检查仅“您自己定义路径,否则必须自动完成”。

尝试这样的事情:

if condition
  does something
  redirect_to(records_path)
end
if performed?
  does another thing
else
  yet another thing
end
于 2018-05-29T11:35:37.787 回答
2

在一个控制器动作中,当我们输入renderredirect_to那些不是立即执行的,而是它们被排队并且会在方法完成之后被执行。因此,这允许在控制器操作中进行双重渲染或 redirect_to,这将产生错误(因为 rails 不知道要执行哪个)。这就是为什么在 Rails 中他们添加了一个方法performed?来指示 a renderorredirect_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因此您可以轻松地将它们压缩在一起。

于 2018-05-29T11:53:19.497 回答
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
于 2018-05-29T10:16:32.787 回答