【问题标题】:Creating a "Delete all Results" button in rails在 rails 中创建“删除所有结果”按钮
【发布时间】:2011-11-10 16:18:55
【问题描述】:

我很难理解我必须做什么才能提供删除所有“结果”的链接

我正在寻找类似的东西:

<%= button_to 'Remove All', @results, delete_all %>

我正在使用 mysql。

编辑 路线.rb:

Productfinder::Application.routes.draw do
resources :contacts
resources :helps
get "help/index"
resources :results
resources :extensions
resources :websites
resources :words
resources :results do
collection do
get 'remove_all'
end
end
get "home/index"
root :to => "results#index"

【问题讨论】:

  • 是否要从 Result 表中删除所有结果?
  • @Ireneusz 我想删除名为 results 的表中的所有结果,但不删除表本身。谢谢
  • 如果是这样,那么 Result.delete_all 对你来说就像一个魅力:)

标签: ruby-on-rails ruby


【解决方案1】:

也许这对你有帮助:

您应该在 routes.rb 中添加:

#rails 3.0
resources :results do
  collection do
    get 'remove_all'
  end
end

#rails 2.3
map.resources :results, :collection => { :remove_all => :get }

在某些视图中,您可以添加此链接:

<%= link_to "Remove All", remove_all_results_path, :method => :get %>

和控制器的操作(在 app/controller/results_controller.rb 中):

def remove_all
  Result.delete_all
  flash[:notice] = "You have removed all results!"
  redirect_to results_path
end

【讨论】:

  • 小心,Result.delete_all 将截断该数据库表。我不认为那是他想要的;)
  • 他想删除他所有的结果,所以我认为他想清除结果表:) 但我们不应该猜测,我们应该问他:)
  • 非常感谢。但是使用这个我得到错误“找不到 ID=remove_all 的结果”任何建议?
  • 奇怪...能不能生成路由,看看remove_all_results_path是否正确?
  • 你有什么版本的rails?
【解决方案2】:

我可以告诉您,通过带有复选框的 javascript 将删除全部处理为单独的销毁调用会更干净。这是我所做的(使用prototype.js):

function delete_selected () {
  var table_id;
  $$('table.data tr td.selector "]').each(function(e) {
    table_id = e.up('table').id;
    var id = e.up('tr').id;
    var destroy_link = e.up('tr').down('td#destroy a');

    var method = 'delete', url = destroy_link.readAttribute('href');

    var csrf_param = $$('meta[name=csrf-param]')[0], csrf_token = $$('meta[name=csrf-token]')[0];

    var params = {};
    params[csrf_param.readAttribute('content').toString()] = csrf_token.readAttribute('content');

    if (csrf_param) {
      new Ajax.Request(url, {    
        'method': method,
        'parameters': params,
        onSuccess: function (transport) {  
          highlight_row(e.up('tr'), 'deleted');
        },
        asynchronous: true
      });
    }
  });

这里是必要的 ruby​​ 代码和一个数据表示例(与默认非常相似):

<%= csrf_meta_tag %>

<a href="#" onclick="delete_selected();">delete selected</a>

<table id="categories" class="data">
  <thead>
    <tr>
      <th class="selector"><input id="all" type="checkbox" /></th>
      <th id="id" class="value">Id</th>
      <th id="name" class="value">Name</th>
      <th id="show" class="action"></th>
      <th id="edit" class="action"></th>
      <th id="destroy" class="action"></th>
    </tr>
  </thead>

  <tbody>
    <% @categories.each do |category| %>
    <tr id="<%= category.id %>">
      <td class="selector"><input type="checkbox" /></td>
      <td id="id" class="value"><%= category.id %></td>
      <td id="name" class="value"><%= category.name %></td>
      <td id="show" class="action"><%= link_to 'Show', category %></td>
      <td id="edit" class="action"><%= link_to 'Edit', edit_category_path(category) %></td>
      <td id="destroy" class="action"><%= link_to 'Destroy', category, :confirm => 'Are you sure?', :method => :delete %></td>
    </tr>
  <% end %>
  </tbody>
</table>

您可以忽略 highlight_row。它只是一个辅助函数,用于突出显示并从表中删除已删除的对象(无需重新加载页面)。我把它留在那里,以便您了解如何管理回调。

无论如何,我知道这不是一个纯粹的 ruby​​ 修复程序,但正如您所见,将它从 delete_selected 转换为 delete_all 只需要很少的努力。干杯。

【讨论】:

    猜你喜欢
    • 2015-07-05
    • 2016-07-15
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 2015-03-10
    相关资源
    最近更新 更多