首先,我得到了这个工作,但我想知道是否有更好的方法来做到这一点。
我有非常多的索引页面,用户可以在其中应用过滤器,然后将结果导出到.csv文件.xls中。
我所做的是将params存在的任何内容(在应用过滤器之后)转发到再次查询数据库并将结果发送到构建文件的服务的控制器操作,如下所示:
链接到:
<li>
<% if params.dig(:q).present? %>
<%= link_to export_payments_admin_payments_path(params: { q: params.require(:q).permit(params[:q].keys, status_in: [], payment_type_in: [])}, format: "csv") do %>
<span class="glyphicon glyphicon-download" aria-hidden="true"></span>
Export
<% end %>
<% else %>
<%= link_to export_payments_admin_payments_path(format: "csv") do %>
<span class="glyphicon glyphicon-download" aria-hidden="true"></span>
Export
<% end %>
<% end %>
</li>
控制器动作:
def export_payments
@pre_search = current_account.payments.includes(:user)
@search = @pre_search.ordered.ransack(params[:q])
@payments = @search.result.paginate(page: params[:page], per_page: 20)
respond_to do |format|
format.csv do
send_data FileManager::PaymentsExporter.new(@payments).call,
filename: "payments_#{Date.today}" + ".csv"
end
end
end
问题是,正如您所知,link_to必须将其包装在条件中,因为如果我require(:q)但它不存在(未应用过滤器),则视图会因所需的:q键不存在而中断。
有一个更好的方法吗?如果我这样做,我已经尝试删除require(:q)但根本没有传递任何参数。