我的目标是显示用户的个人资料图像。有些用户不会上传个人资料图像,所以我想为他们显示一个默认的个人资料图像。
我可以在视图中这样做:
<% if post.user.avatar.presence %>
<%= image_tag post.user.avatar.url %>
<% else %>
<%= link_to user_path(post.user), :class => "default-profile-image" do %>
<i class="fa fa-user"></i>
<% end %>
<% end %>
但这似乎不是最优的。如果我想在其他地方使用这个逻辑呢?我不想在我的视图中重复这段代码。
在我的应用程序的其他地方回收这些代码的最佳方法是什么?
谢谢!
偏导数
你应该创建一个app/views/users/_avatar.html.erb
部分,在你的问题中移动代码,然后每次你想渲染一个角色,使用
<%= render 'users/avatar', user: post.user %>
假设您正在使用CarrierWave或PaperClip,这些库有默认/备用图像。对于CarrierWave中的回退图像,您只需在与用户配置文件图像相关的上传器上定义default_url
方法。
这不能像你在代码中那样实现HTML,但我认为它可以取代它。如果你真的想要代码中显示的HTML,我建议使用一个包装你的User对象的Presenter,如果头像不存在,它会输出适当的HTML,也许通过渲染部分,如@meagar所建议的。我的观点是:尝试通过调用对象上的方法来实现您的目标。通常应该有一种足够简单的方法来调用对象上的方法,并让它输出所需的内容。