【问题标题】:How do I create a button to sort a table by certain attributes? Im using Ruby on Rails如何创建一个按钮来按某些属性对表格进行排序?我正在使用 Ruby on Rails
【发布时间】:2015-02-05 01:48:12
【问题描述】:

我为项目的待办事项列表应用创建了此表。我想创建将按表、客户端、已完成和未完成的排序表的按钮。我不知道该怎么做。..

这是表格的代码:

<table>
  <thead>
    <tr id="headers">
      <th>Title</th>
      <th>Client</th>
      <th>Description</th>
      <th>Hours</th>
      <th>Done</th>
      <th colspan="3"></th>
    </tr>
  </thead>


  <tbody class="col-md-2" id="listItems">
    <% @projects.each do |project| %>
      <tr id="table">
        <td><%= project.title %></td>
        <td><%= project.client %></td>
        <td><%= project.description %></td>
        <td><%= project.hours %></td>
        <td><%= project.done %></td>

        <td><%= link_to " #{image_tag('show.png')}".html_safe, project, id:'showButton' %></td>


        <td><%= link_to " #{image_tag('edit.png')}".html_safe, edit_project_path(project),     id:'editButton' %></td>

        <td><%= link_to " #{image_tag('destroy.png')}".html_safe, project, id:'destroyButton', method: :delete, data: { confirm: 'Are you sure?' } %></td>

      </tr>
    <% end %>
  </tbody>
</table>

【问题讨论】:

  • 我听说数据表(jquery 插件)可以做这样的事情。
  • 您可以使用 Sergio 建议的插件来完成,也可以在 Rails 中完成(通过每次单击表头时向控制器发出附加请求)。你有偏好吗?
  • @JackZelig 我想在 Rails 中做,我想有 4 个按钮:按客户端 AZ 排序,按客户端 ZA 排序,按完成-未完成排序,然后是最近(正常列表)。如果可以的话!谢谢
  • 我建议使用 jquery 而不是 rails/ruby。在较小的集合上,不去数据库进行排序会更快。如果您使用数据库(杰克的回答很棒),请考虑在您要排序的字段上放置一个索引。只是为了加快阅读速度。 (我说考虑不做)
  • @baash05 谢谢,我会,但我真的不知道该怎么做。这是一个课堂项目,我们只学过 Ruby。

标签: ruby-on-rails ruby sorting html-table


【解决方案1】:

有一个很棒的 RailsCast 解释了如何做到这一点:#228 Sortable Table Columns

但是,由于简单地链接到解决方案的答案是不受欢迎的,以下是您将如何在您的案例中实现它(代码大量借用 RailsCast 情节):

首先,创建一个辅助方法。它应该有两个参数。第一个参数是列名,第二个是列标题文本,如果这与列名不同的话。第二个参数是可选的。

/app/helpers/application_helper.rb
module ApplicationHelper
  def sortable(column, title = nil)
    title ||= column.titleize
    direction = (column == sort_column && sort_direction == "asc") ? "desc" : "asc"
    link_to title, :sort => column, :direction => direction
  end
end

像这样改变你的 index.html.erb:

/app/controllers/projects_controller.rb
<tr id="headers">
  <th>Title</th>
  <th><%= sortable "client" %></th>
  <th>Description</th>
  <th>Hours</th>
  <th>Done</th>
  <th colspan="3"></th>
</tr>

这里,我只是在客户端列上实现它。

在项目控制器的索引操作中,您可以:

helper_method :sort_column, :sort_direction
def index
  @projects = Project.order(sort_column + ' ' + sort_direction)
end

private
def sort_column
  Project.column_names.include?(params[:sort]) ? params[:sort] : "client"
end

def sort_direction
  %w[asc desc].include?(params[:direction]) ?  params[:direction] : "asc"
end

helper_method 的使用使得 ApplicationHelper 可以使用两个 sort_ 方法,以便它们可以在可排序帮助器中使用。

这两个sort_ 方法可防止 SQL 注入并用于设置合理的默认值。

就是这样。您的客户列现在可以排序了。

【讨论】:

  • 我把所有这些代码都放进去,我得到了一条错误消息“ProjectsController#index 中的语法错误,意外的输入结束,期待关键字结束”
  • 那你错过了一个“结束”之类的东西。
猜你喜欢
  • 1970-01-01
  • 2011-08-13
  • 2013-03-25
  • 1970-01-01
  • 2019-12-02
  • 2017-12-30
  • 2019-11-23
  • 1970-01-01
  • 2022-12-04
相关资源
最近更新 更多