Rails 想把 Ransack 搜索结果导出到 Excel,但每次导出的却是该 model 的全部数据

087796 · 2012年04月18日 · 最后由 xds2000 回复于 2012年04月19日 · 4400 次阅读

问题描述:把搜索结果到 excel、csv,能够生成 excel,但 excel 中的数据不是搜索到的结果数据,而是该 model 的全部数据。百思不得其解...困扰两天了,请教各位。

  • 开发环境:rails3.2.3,ruby1.9.3;
  • 使用 to_xls gem 导出 excel;使用 ransack gem 实现搜索;前端使用 bootstrap-sass gem;ransack 能正确返回搜索结果;能导出 excel,说明 to_xls 也运行正常。
  • code:

controller: def index @search = Project.search(params[:q]) @projects = params[:distinct].to_i.zero? ? @search.result : @search.result(distinct: true) respond_to do |format| format.html # index.html.erb format.json { render json: @projects } format.xls { send_data @projects.to_xls, filename: 'results.xls' } end end

viewer: (1)index.html.erb

<%= search_form_for([:admin, @search], :html => { :class => "form-horizontal"} ) do |f| %>

<%= f.label :number_cont,'项目编号' %> <%= f.text_field :number_cont %>

<%= f.label :title_cont, '项目名称包含...' %> <%= f.text_field :title_cont %>

<%= f.submit "Search" %>

<% end %>

/下面这两条语句,作为调试,能够正确返回搜索结果/

SQL: <%= @projects.to_sql %>

共 <%= @projects.size %>条记录

<%= render 'results' %>

(2)_results.html.erb

<% @projects.each do |project| %> <% end %>
项目编号 项目名称 立项年度 负责人 承担单位
<%= link_to project.number, admin_project_path(project) %> <%= project.title %> <%= project.approve_date %> <%= project.superintendent %> <%= project.responsibility_unit %>

<%= button_to "导出为 excel", admin_projects_path(:format => 'xls') %> routes.rb routes.rbnamespace :admin do |admin| resources :projects do resources :users end

不知道我遗漏了什么没有。请问:@projects实例变量的确是搜索后的结果,但导出时,却是 Project.all 的全部数据。 请问,问题出在了哪?解决方案是什么。谢谢。

点击“导出为 excel”按钮,相当于另一次请求。params[:q] 就会为空,导致@projects实例就为 Project.all

导出 excel 也写个类似的 f.submit,controller 里判断下是哪个 submit 提交

导出的 URL 也要带上参数

admin_projects_path(:format => 'xls', :number_cont => @search.number_cont, :title_cont => @search.title_cont)

#1 楼 @xds2000 看了你的解答,理解了。继续向您请教一下:该怎么做?才能完成我这个功能....实在是木有思路。

#3 楼 @doitian 按照你的解决方案,给 url 加上参数,会返回 http 406 错误;依然导出不成功。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号