所以我的应用程序中有一个表,现在我想实现排序功能。所以我有这个:
<div class="row dashboard__block">
<div class="col-lg-12">
<div class="row">
<div class="col-lg-12 text-center text-primary mb-3">
<strong>Prices are accurate as
of <%= CardHelper::get_update_accuracy(Time.now - @last_update) %></strong>
</div>
</div>
<% if active_cards.present? %>
<div class="row">
<table class="table table-sm table-striped table-smaller">
<thead>
<tr>
<%# todo: create sort links to append parameters asc and desc %>
<th scope="col">
<%= link_to dashboard_active_path(params.permit(:layout, :page, :items_per_page).merge(active_title_sort: :desc)) do %>
Item title <i class="fa fa-sort"></i>
<% end %>
</th>
<th scope="col">
<%= link_to dashboard_active_path(params.permit(:layout, :page, :items_per_page).merge(active_current_price_sort: :desc)) do %>
Current Price <i class="fa fa-sort"></i>
<% end %>
</th>
<th scope="col">
<%= link_to dashboard_active_path(params.permit(:layout, :page, :items_per_page).merge(active_time_left_sort: :desc)) do %>
Time Left <i class="fa fa-sort"></i>
<% end %>
</th>
<th scope="col">Item Link</th>
</tr>
</thead>
<tbody>
<% if active_cards.present? %>
<% active_cards.each do |card| %>
<tr>
<th><%= card.item_title %></th>
<th>$ <%= card.sale_price.present? ? sprintf('%.2f', card.sale_price) : "Not Available" %></th>
<th><%= card.sale_date %></th>
<% if card.item_id.present? %>
<th>
<%= link_to "https://www.website.com/itm/#{card.item_id}", target: '_blank' do %>
<i class="fa fa-eye"></i> View
<% end %>
</th>
<% else %>
<th>
Not Available
</th>
<% end %>
</tr>
<% end %>
<% end %>
</tbody>
</table>
</div>
<% else %>
<%= render partial: 'shared/empty_block' %>
<% end %>
</div>
</div>
我的目标是重构表头上的链接,现在看起来像这样:
<th scope="col">
<%= link_to dashboard_active_path(params.permit(:layout, :page, :items_per_page).merge(active_title_sort: :desc)) do %>
Item title <i class="fa fa-sort"></i>
<% end %>
</th>
所以我在考虑如何实现一个辅助方法,以使用适当的图标,保留的参数链接和HTML形式返回这些链接。
我的出发点是这样的:
def sortable(path, column, title = nil)
title ||= column.titleize
css_class = column == sort_column ? "current #{sort_direction}" : nil
direction = column == sort_column && sort_direction == "asc" ? "desc" : "asc"
link_to title, {sort: column, direction: direction}, {class: css_class}
end
我从https://www.youtube.com/watch?v=cWYiAVMSHD4&t=460s取来的
我想写一个比这更干净的代码。
谢谢。
答案 0 :(得分:1)
我将为此视图制定一些帮助方法,以清理很多东西。
def link_to_dashboard(text, extra_params)
link_params = params.permit(:layout, :page, :items_per_page).merge(extra_params)
link_to dashboard_active_path(link_params) do
%Q|#{text} <i class="fa fa-sort"></i>|
end
end
然后您可以像使用它一样
<%= link_to_dashboard('Item Title', active_title_sort: :desc) %>
您还可以使用循环来创建th
。
<tr>
<%
[
['Item title', {active_title_sort: :desc}],
['Current Price', {active_current_price_sort: :desc}],
['Time Left', {active_time_left_sort: :desc}],
].each do |label, sort_params|
%>
<th scope="col">
<%= link_to_dashboard(label, sort_params) %>
</th>
<% end %>
</tr>
像这样的循环使添加更多排序列标题变得容易得多。您甚至可以在控制器中指定该数组并使用实例变量。那将是最干净的。将其放入控制器顶部的常量中,并在操作内部将实例变量设置为常量。这也将是有效的,因为您将重用相同的哈希(只要您不对其进行突变)。