优雅的方式只显示记录,如果它们存在于轨道ERB中

我发现在显示用户信息时,我在ERB视图中使用了大量重复代码。 沿着这条路线

   

我基本上是为了避免错误(例如可能没有所有新字段的老用户)而在我看来为此做的一切。

有一个更好的方法吗?

将逻辑移动到帮助器中:

 def name_for(user) user.name if user.name.present? end 

并在您的视图中调用该帮助程序:

 <%= name_for(@user) %> 

请注意,在没有名称的用户上调用@user.name不会生成错误。 如果@user.namenil ,则只有在尝试在nil上调用另一个方法时才会出现错误,例如@user.name.upcase

因此,如果您的条件没有包含视图的任何其他部分,并且您很乐意在用户没有名称时留下空白区域,则可以使用@user.name而不使用if检查。

如果你有一个更复杂的例子,你也可以看一下使用try 。 例如,如果用户属于某个组,但某些较旧的用户没有组,则可以显示组名称:

 @user.group.try(:name) 

try nil只是安全地返回nil而没有错误。

https://github.com/raganwald/andand

使用它来避免这些错误

user.andand.name

它将检查用户对象是否为nil,然后不在其上调用name。

你也可以选择这个:

 <%= @user.name if @user.name.present? %> 

但是如果你重复完全相同的事情,最好的方法是在你的助手中创建一个def,就像Florent指出的那样 。