2015-05-07 88 views
3

我发现我在使用ERB视图显示用户信息时使用了大量的重复代码。沿优雅的方式来显示记录,如果他们存在轨道ERB

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

线基本上,我在我看来,这样做的一切,以避免错误(谁可能没有所有的新领域如老年用户)。

有没有更好的方法来做到这一点?

+0

如果@ user.name.present可以内联测试'<%= @ user.name? %>'IIRC – Tensibai

+1

'<%= @ user.try:name%>' – Pavling

回答

7

移动逻辑到一个帮手:

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

并调用你的观点,即帮手:

<%= name_for(@user) %> 
+0

正是我在寻找的东西,感谢您指引我朝着正确的方向 –

1

注意,呼吁用户@user.name不具有名称不会产生一个错误。如果@user.namenil,则只有当您尝试调用nil时,才会发生错误。 @user.name.upcase

因此,如果您的条件没有包含视图的任何其他部分,并且您很高兴在用户没有名称的情况下留出空白区域,则只需使用@user.name而不需要if检查。

如果您有更复杂的示例,您还可以查看使用try。例如,如果用户属于一个组,但是一些老用户不必,你可以用显示组名组:

@user.group.try(:name) 

trynil只是安全返回nil没有一个错误。

0

你也可以去这一个:

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

但是,如果你重复完全相同的东西,最好的办法是建立在你的助手为Florent pointed out一个DEF。

相关问题