单击时禁用引导表行并将其保存在 Ruby on Rails 中

Posted

技术标签:

【中文标题】单击时禁用引导表行并将其保存在 Ruby on Rails 中【英文标题】:Disabling a Bootstrap table row on click and have it save in Ruby on Rails 【发布时间】:2018-05-04 12:08:16 【问题描述】:

我有一个表格,该表格将根据用户填写的表格填充用户信息。我想做的一件事是让管理员在处理完该用户后能够“归档”表格行。

我认为我可以做到这一点的两种方法是,当单击该行上的存档按钮时将特定表行变灰,或者将该行向下移动到另一个表,一个专门用于存档用户的表。

我不想删除用户的信息,只是存档以防管理员再次需要它

这里最大的事情主要是保存它。

这是我的 index.html.erb 文件中的当前表格:

<table id="table-current"  data-toggle="table" class="table">
  <h3>Current Submissions</h3>
  <thead>
    <tr>
      <th data-sortable="true">Name</th>
      <th data-sortable="true">Email</th>
      <th data-sortable="true">Phone Number</th>
      <th data-sortable="true">Pick Up Address</th>
      <th data-sortable="true">City</th>
      <th data-sortable="true">Pick Up Date</th>
      <th data-sortable="true">Pick Up Time</th>
      <th data-sortable="true">Instructions</th>
      <th data-sortable="false">Options</th>
    </tr>
  </thead>
  <% @clients.each do |client| %>
      <tr class="table-row">
        <td><%= client.first_name %> <%= client.last_name %></td>
        <td><a href="mailto:<%= client.email %>"><%= client.email %></a></td>
        <td><a href="tel:<%= client.phone_number %>"><%= number_to_phone(client.phone_number) %></a></td>
        <td><a href="https://maps.google.com/?q=<%= client.pick_up_location %>&t=m" target="_blank"><%= client.pick_up_location %></a></td>
        <td><%= client.city %></td>
        <td><%= client.pick_up_date %></td>
        <td><%= client.pick_up_time.strftime("%l:%M %p") %></td>
        <td><%= client.instructions %></td>
        <td class="table-options">
          <%= link_to edit_client_path(client) do %>
            <i class="ion-edit"></i>
          <% end %>
          <button class="archive">
            <i class="ion-ios-box"></i>
          </button>
        </td>
      </tr>
  <% end %>
</table>

感谢任何帮助!谢谢!

【问题讨论】:

【参考方案1】:

您不需要为此维护单独的表。

https://github.com/rubysherpas/paranoia

看看这颗宝石。您想要的是软删除。通过在各自的表中添加 deleted_at 。使用基于 ajax 的删除,这样您就可以将整行显示为灰色归档的行。

<% @clients.each do |client| %>
    <tr class="table-row" id="client_<%= client.id %>">
      <td><%= client.first_name %> <%= client.last_name %></td>
      <td class="table-options">
        <%= link_to edit_client_path(client) do %>
          <i class="ion-edit"></i>
        <% end %>
        <button class="archive">
          <i class="ion-ios-box"></i>
        </button>
      </td>
    </tr>
  <% end %>

您可以为您的行分配一个唯一的 ID。然后使用 js.erb 来使用 AJAX 功能。

【讨论】:

【参考方案2】:

Paranoia 是一个不错的宝石,但需要注意的是它覆盖了 ActiveRecord 的 destroy 方法 (https://github.com/rubysherpas/paranoia/blob/92505787662e0415f228a3507a885ba771058ff1/lib/paranoia.rb#L72)。

如果您对此感到满意,偏执狂是完美的宝石。

另一种选择是推出自己的策略。偏执狂本质上只是在您的模型中添加另一列以在您调用销毁时填充。或者,您可以添加自己的列,可能类似于 archived,并将其设为布尔值(或者您可以使用带有时间戳archived_at,如 gem)。我喜欢在我的模型中使用肯定句,所以我可能会调用列active,创建新记录时默认为true,当我要归档记录时更改为false

现在您可以使用附加到表的 ajax 链接和进程向控制器发送一条消息,以便在用户想要归档记录时更新该新列。最后,您将在表中添加逻辑以显示或隐藏(如果您愿意,也可以灰显)基于此新列的记录,或者在表中,或者通过在类上创建范围并仅将范围集合发送到视图:

app/models/client.rb

class Client

  scope :active, ->  where(active: true) 
  scope :archived, ->  where(active: false) 

  ...
end

app/controllers/clients_controller.rb

class ClientsController

  def index
    @clients = Client.active
  end
  ...
end

如果您想显示所有记录但只是将该行显示为灰色,您可以在表格行中添加一个条件类:

<tr class="table-row <%= ‘archived’ unless client.active? %>">

您可以根据自己的喜好设置“已归档”课程的样式。有几种方法可以完成这部分,这只是一个例子。

【讨论】:

我有一个小小的顿悟,并在发布此问题后立即考虑这样做,哈哈。我要试一试! 当你说“现在你可以使用你的 ajax 链接和进程”时,我该怎么做?我不是最熟悉 ajax。 啊,很抱歉,当我阅读这篇文章时,我以为你提到了使用 Ajax,但我发现这是另一个答案提到的。需要明确的是,您不需要 Ajax 来执行此操作,您可以使用更新模型并调用重新加载页面的重定向的标准方式来执行此操作。 Ajax 用于当您希望流程是异步的时,在这样的实例中,给出字段已归档而不显示重新加载的外观。 有点长的评论提供一个例子,但我推荐这个例子作为介绍:richonrails.com/articles/basic-ajax-in-ruby-on-rails 我还会查看其他关于使用 Ajax 在 Rails 页面上“切换”特性的堆栈溢出帖子

以上是关于单击时禁用引导表行并将其保存在 Ruby on Rails 中的主要内容,如果未能解决你的问题,请参考以下文章

使用jquery单击按钮时可编辑的引导表行

MVC 将表行数据传输到引导模式弹出窗口

使用Jquery和PHP单击保存按钮时如何将多个表行更新为mysql表?

在 ruby​​ on rails 动态 id 不能用于两个词,但可以完美地用于一个词——使用引导程序崩溃

在引导程序中单击元素内部时如何禁用切换功能

如何禁用来自循环的其他div,除了单击的div