我正在开发一个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?
对不起我的英语不好,这不是我的母语。答案 0 :(得分:0)
由于您已经在index
操作中进行了分页,因此最简单的方法是重复使用相同的逻辑,但输出CSV而不是HTML。
您没有指定Your Rails版本,但是对于任何最新版本,实现此目的的最快方法是使用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字符串,因此它更加统一,它们是辅助方法,是实际的输出操作。