Rails:导出到excel用户在当前页面中可见的所有内容

时间:2015-12-17 11:45:17

标签: ruby-on-rails

我正在开发一个Rails项目,我有下一个问题:

我有用户视图,列出了所有用户,点击每个用户我重定向到视图,其中包含有关被点击用户的所有信息,我想要做的是,导出所有用户在该视图中可见excel文件及其所有相关信息。

所以列将是这样的:

| ID |名称|注意事项|平衡| | 1 | user1 | aasfs | 33.44 | | 2 | user2 | aasfs | 33.44 | | 3 | user3 | aasfs | 33.44 |

我几乎完成了在控制器上导出数据的逻辑:

用户控制器:

def index
    @users = User.all.page(params[:page]).order('created_at DESC').per(10)
    if params[:search]
      @users = Client.search(params[:search]).page(params[:page]).order('created_at DESC').per(10)
    end
  end

def export_to_csv
    @users = User.find(:all)
    csv_string = CSV.generate do |csv|
      csv << ["Id", "name","notes","balance"]
      @clients.each do |user|
        csv << [user.id, user.name, user.notes, user.balance ]
      end
    end

    send_data csv_string,
              :type => 'text/csv; charset=iso-8859-1; header=present',
              :disposition => "attachment; filename=users.csv"
  end

我知道我也需要实现一个if语句,只导出具有相同ID的用户,但我的问题是在前端部分:

    <%= link_to '#', { onclick: "$('#export_users').submit()", class:"btn btn-primary" } do %>
        <i class="fa fa-trash-o"></i> <span class="bold">Export</span>
    <% end %>
    <%= link_to '#', { onclick: "$('#delete_users').submit()", class:"btn btn-danger" } do %>
       <i class="fa fa-trash-o"></i> <span class="bold">Delete</span>
    <% end %>
  </div>
</div>
<div class="row mrg-top-20">
  <div class="col-sm-12">
    <div class="hpanel">
      <div class="panel-heading hbuilt">
          users
        </div>
        <div class="panel-body">
          <table class="table table-striped">
            <thead>
              <tr>
                <th class="wdt-30"></th>
                <th>Name</th>
                <th></th>
              </tr>
            </thead>
            <%= form_tag(delete_users_path, method: :post,:id => 'delete_users',) do %>
              <% @clients.each do |client| %>
                <tr>
                  <td class="wdt-30"><%= check_box_tag 'ids[]', client.id, false, :class => 'table-row-checkbox' %></td>
                  <td><%= link_to client.name, edit_client_path(client)  %></td>
                   <td></td>
                </tr>
              <% end %>
            <% end %>
          </table>
        </div>
    </div>
  </div>
</div>

我如何获得以及页面中显示的所有用户ID(例如我们每页可以拥有30个用户)并向控制器发送请求以导出用户?

我是一个删除已检查用户的表单,因此我无法以其他形式实现表单,那么哪个是最佳解决方案?也许用javascript获取用户ID?

对不起我的英语不好,这不是我的母语。

1 个答案:

答案 0 :(得分:0)

由于您已经在index操作中进行了分页,因此最简单的方法是重复使用相同的逻辑,但输出CSV而不是HTML。

您没有指定Your Ra​​ils版本,但是对于任何最新版本,实现此目的的最快方法是使用Rails的respond_to帮助程序。

在您的HTML中创建一个返回当前页面的链接,但格式不同:

<%= link_to "Download CSV", params.merge(:format => :csv) %>

然后修改控制器:

def index
  @users = User.all.page(params[:page]).order('created_at DESC').per(10)
  if params[:search]
    @users =   Client.search(params[:search]).page(params[:page]).order('created_at DESC').per(10)
  end

  respond_to do |format|
    format.html # renders HTML view
    format.csv do 
      send_data users_to_csv(@users),
              :type => 'text/csv; charset=iso-8859-1; header=present',
              :disposition => "attachment; filename=users.csv"
    end
  end
end

def users_to_csv(users)
  CSV.generate do |csv|
    csv << ["Id", "name","notes","balance"]
    users.each do |user|
      csv << [user.id, user.name, user.notes, user.balance ]
    end
  end
end

这样,您使用的分页设置或搜索,完全相同的用户组将导出为CSV。

注意:我重命名了export_to_csv并使其返回CSV字符串,因此它更加统一,它们是辅助方法,是实际的输出操作。