有没有更清洁的方法可以使用Ruby on Rails编写这段代码?

时间:2018-07-13 01:57:14

标签: ruby-on-rails ruby

所以我的应用程序中有一个表,现在我想实现排序功能。所以我有这个:

<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取来的

我想写一个比这更干净的代码。

谢谢。

1 个答案:

答案 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>

像这样的循环使添加更多排序列标题变得容易得多。您甚至可以在控制器中指定该数组并使用实例变量。那将是最干净的。将其放入控制器顶部的常量中,并在操作内部将实例变量设置为常量。这也将是有效的,因为您将重用相同的哈希(只要您不对其进行突变)。