如何在Ruby中正确使用guard子句

Sas*_*sha 10 ruby ruby-on-rails clause guard

在此示例中使用guard子句的正确方法是什么?

def require_admin
  unless current_user && current_user.role == 'admin'
    flash[:error] = "You are not an admin"
    redirect_to root_path
  end        
end
Run Code Online (Sandbox Code Playgroud)

尝试使用这些https://github.com/bbatsov/ruby-style-guide#no-nested-conditionals约定重写时,我不知道在哪里放置flash消息

Jus*_*tin 20

您可以在return此处使用该语句.从本质上讲,没有必要让方法继续if满足这些条件,所以你可以尽早摆脱困境.

def require_admin
  return if current_user && current_user.role == 'admin'

  flash[:error] = "You are not an admin"
  redirect_to root_path
end
Run Code Online (Sandbox Code Playgroud)

  • 为了扩展Justin的答案,我实际上会在您的用户模型中为角色admin创建一个方法.这样你可以调用`current_user.admin?`进行检查.只是一点清洁.或者您甚至可以为非管理员编写一个方法,并将您的保护子句更改为`return,除非current_user.not_admin?` (3认同)
  • 这是较旧的,但我仍然认为我应该在 return 条款中添加一个小建议。由于 ruby​​ 中有安全导航运算符,因此我们可以将该保护子句重构为“return if current_user&.role == 'admin'”,这更加简洁。 (2认同)