参考:https://medium.com/swlh/using-rails-and-html-to-view-sort-and-search-tables-fbf8a0543558

普通的列表页面:

#views/players/index.html.erb<h1>Players List</h1><table>
<tr>
<th>Player Name </th>              <-- Each of these
<th>Position </th>                      is a column header
<th>Avg. Ranking </th>
</tr>
<% @players.each do |player| %>
<tr>
<td><%= player.name%></td>         <-- Each of these adds
<td><%=player.position %></td><td>     data to the corresponding
<td><%=player.avg_ranking %></td>      column in the same row
</tr>
<% end %>
</table>

使用排序的列表页面

<h1>Players List</h1><table>
<tr>
<th><%= link_to "Player Name", :sort => "name"%> </th>
<th><%= link_to "Position", :sort => "position"%> </th>
<th><%= link_to "Avg. Ranking", :sort => "avg_ranking"%> </th>
</tr>
<% @players.each do |player| %>
<tr>
<td><%= player.name%></td>
<td><%=player.position %></td><td>
<td>  <%=player.avg_ranking %></td>
</tr>
<% end %>
</table>

实现点击进行排序

在controller进行增加

class PlayersController < ApplicationController  def index
@players = Player.order(params[:sort])
end

增加:

class PlayersController < ApplicationController
def index
if params[:sort] != "avg_ranking"
@players = Player.order(params[:sort])
elsif params[:sort] == "avg_ranking"
@players = Player.all.sort_by{|player| player.avg_ranking}
else
@players = Player.all
end
end

使用form表单:

<%= form_tag(players_path, method: :get) do %>
<p> Search for a player </p>
<%= text_field_tag(:search, params[:search]) %>
<%= submit_tag ("Search") %>
<% end %>

那么:

class PlayersController < ApplicationController
def index
if params[:search]
search_players
if params[:sort] == "avg_ranking"
@players = Player.all.sort_by{|player| player.avg_ranking}      
elsif params[:sort] != "avg_ranking"
@players = Player.order(params[:sort])
else
@players = Player.all
end
enddef search_players
if @player = Player.all.find{|player| player.name.include?(params[:search])}
redirect_to player_path(@player)
end
enddef show
@player = Player.find(params[:id])
endend