Rails 5.2:if current_user 与 current_user.present 的区别?在视图中

Jun*_*say 2 ruby-on-rails rails-activerecord

我关注这个帖子。在我看来:

- if current_user
- if current_user.present?
- if current_user.exists?
- if current_user.any?
Run Code Online (Sandbox Code Playgroud)

我收到错误:

undefined method `exists?' for #<User:0x00007fd68f4067b8>
undefined method `any?' for #<User:0x00007fd68f4067b8>
Run Code Online (Sandbox Code Playgroud)

所以只有前 2 个工作。为什么?性能是否有任何差异:

- if current_user
vs
- if current_user.present?
Run Code Online (Sandbox Code Playgroud)

和

- if current_user.name
vs
- if current_user.name.present?
Run Code Online (Sandbox Code Playgroud)

And*_*eko 6

当你在对象上调用方法时,你必须知道你在做什么。

current_user.present?
Run Code Online (Sandbox Code Playgroud)

在这里,您调用了一个present?在对象上调用的方法current_user。这是有效的,因为方法present?是在这个对象上定义的。当你做

current_user.exists?
Run Code Online (Sandbox Code Playgroud)

您希望current_user响应名为 的方法exists?。但它没有,因此错误。

你在这个问题中混淆了几件事。

仅当您确定对象响应此方法时才调用该对象的方法。

if current_uservs之间的区别if current_user.present?是隐式与显式检查对象真实性。看,在 Ruby 中,除了falseand之外的一切nil都是真的。所以if current_user意味着 ifcurrent_user是除了nilor之外的任何东西,false然后继续。您依赖于表达式评估,而current_user.present?您显式地依赖于方法调用 ( present?)的返回值。

我建议你

  • 总是使用显式,因为它读起来更好;
  • 阅读 Ruby 中的对象和方法。