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

时间:2018-05-29 10:02:03

标签: ruby-on-rails ruby instance-method

如何使用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获得它?

3 个答案:

答案 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)

在控制器操作中,当我们键入renderredirect_to时,它们不会立即执行,但它们会排队并在完成方法后执行。因此,这允许在控制器操作中具有双重渲染或redirect_to,这将产生错误(因为那时rails不知道要执行哪个)。这就是为什么在rails中他们添加了一个方法performed?,它将指示是否已经调用renderredirect_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的否定因此,您可以轻松地将它们压缩在一起。