Partial refactoring

Rails 有提供一個很巧妙的工具,可以讓 view 的結構更簡潔。因為測試已經寫好了,所以這節我們可以更有自信地進行重構。

首先,我們要把原先的 li 改用 render 取代:

app/views/users/index.html.erb

<% provide(:title, 'All users') %>
<h1>All users</h1>

<%= will_paginate %>

<ul class="users">
  <% @users.each do |user| %>
    <%= render user %>
  <% end %>
</ul>

<%= will_paginate %>

這邊在調用 render 的時候,不是使用 partial 名稱的字串,而是一個 User class 的變數 user,Rails 會自動去尋找 _user.html.erb 的 partial,所以我們必須建立一個:

變數名稱不一定要使用 user,迭代時如果是寫 @users.each do |foobar|,那就要用 render foobar。重點是要知道物件的所屬 class,也就是 User

app/views/users/_user.html.erb

<li>
  <%= gravatar_for user, size: 50 %>
  <%= link_to user.name, user %>
</li>

但其實我們可以直接使用 @users 變數:

app/views/users/index.html.erb

<% provide(:title, 'All users') %>
<h1>All users</h1>

<%= will_paginate %>

<ul class="users">
  <%= render @users %>
</ul>

<%= will_paginate %>

Rails 會判斷 @users 是 User class 的物件列表,傳給 render 之後,Rails 就會自動迭代這個物件列表,然後透過 _user.html.erb partial 渲染出每個物件。

最後再執行一次測試,確保通過(Green):

$ bundle exec rake test