1

我构建了一个小型 Web 应用程序,其中主视图显示一个表,管理员可以选择通过使用以下方法从数据库中删除一行来删除它:

*.destroy

但是我想保留数据库中的所有条目,但仍然希望用户能够从表中删除行并且不知道如何去做。我正在考虑使用两个不同的数据库表,但想检查是否有更简单的方法?

这是我的主要观点:

<h1>Student List</h1>

<table class ="Tables">
<tr>
<th>First Name</th>
<th>Last Name</th>
<th>Date Submit</th>
<th>Floor Preference</th>
<th></th>
</tr>

<% @students.each do |student|%>
<tr>
<td><%= student.f_name %></td>
<td><%= student.l_name %></td>
<td><%= student.created_at %></td>
<td><%= student.floor_pref %></td>
<td><%= button_to 'Remove', student, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</table>
<br />
<%= link_to 'New Student', new_student_path %>
4

3 回答 3

7

您可以通过在具有布尔值的同一个表中创建一个额外的列来轻松地做到这一点。所以额外的列名可以是isActive。删除行的 isActive 将为 0,其余为 1。在获取数据时,只需额外检查 isActive = 1 的位置

于 2013-06-21T13:49:14.787 回答
2
rails g migration AddActiveToStudents active:boolean

然后在视图中,您可以在他们单击“删除”按钮时更改该值

然后把支票放在后面.each do |student|

<% if student.active %>
..........display..............
<% end %>
于 2013-06-21T13:53:56.580 回答
0

这个解决方案有点劳动密集,但对我有用。我的步骤类似,但我会提供更多细节,因为我是编程新手,所以我假设还有其他人也是新手:

假设:-您正在使用单个模型、视图和控制器(例如,模型是 Foo)-您可以通过单击启动控制器操作的按钮从数据库中删除记录(“销毁”)-如果您有关联,从数据库中销毁记录对您的应用程序来说是有问题的。

  1. 为名为 is_active 的新列创建了迁移,数据类型为:布尔值。验证 rails 是否正确创建了迁移。如果没有,请手动调整迁移文件。确保在对数据库进行任何更改后捆绑 exec rake db:migrate。重新启动您的服务器。

  2. 通过将 is_active 变量设置为 false 来编辑控制器中的销毁操作。布尔计算结果为“真”或“假”。对我们来说,'false' 将代表一个“已删除”行(虽然它不会在数据库中被删除,只是从视图中隐藏。例如 @foo.is_active = false。一定要使用“=”运算符,它分配值。在视图中,您将使用不同的运算符 (==)。确保在任何编辑后进行保存。例如 @foo.save。此外,注释掉任何销毁代码。例如 # @foo.destroy

    2a。我还在创建操作中将 is_active 值设置为“true”。这可能不是必需的,但到目前为止它对我有用。如果您进行了此调整,请记住保存。例如@foo.is_active = true, @foo.save

  3. 在显示结果的视图中,添加条件语句。我正在遍历我的表格并绘制结果。我的 if 语句在我的 do 循环之后。如果它评估为“假”,我将显示一行文本。否则,如果它评估为“真”,我将显示我的数据。(通常,在后续行中,我有:Do Loop、'False' iF 语句、Else、'True' Data 、结束标记)。

所以,在“if”语句中,我告诉 Rails,当你循环通过时,如果你看到 foo.is_active 为“false”的行,则显示此文本。否则 (else) 显示 'else' 和 'end' 之间的数据。请注意视图中的操作员与控制器的不同之处。在视图中,我们正在检查是否相等 (==),而不是为 (=) 分配值。

确保您调用的变量与您在控制器的销毁操作中设置的变量相匹配。它们必须一致,否则您将收到错误消息。在我弄清楚之前,这给了我几个小时的问题。所以如果你在你的控制器中设置@foo,那么你只能在你的视图中调用@foo。

最后,我正在使用的视图是我的索引,但我也在我的显示视图中添加了一个条件语句,因此我的用户可以打开或关闭 is_admin。使用 simple_form_for 表单,我将 is_admin 变量添加为布尔值,该变量在我的显示表单上显示为复选框。检查后,is_admin为“ true”,并且该行将显示。未选中时 is_admin 为“假”,因此被隐藏。

于 2015-07-03T18:18:43.703 回答