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