html - 如果所需的密钥不存在,如何在不中断的情况下传递 link_to 中的参数?
问题描述
首先,我得到了这个工作,但我想知道是否有更好的方法来做到这一点。
我有非常多的索引页面,用户可以在其中应用过滤器,然后将结果导出到.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)
但根本没有传递任何参数。
解决方案
您应该将所有这些逻辑移至控制器或助手。
首先创建一个方法来挂载链接内发送的参数,这样您就不需要将其包装成条件
# controller
def export_payments
...
@q_params = q_params
...
end
def q_params
if params.dig(:q).present?
params.require(:q).permit(params[:q].keys, status_in: [], payment_type_in: [])
else
{}
end
end
然后,使用该方法呈现链接:
# view
<%= link_to export_payments_admin_payments_path(format: "csv", params: { q: @q_params }) do %>
<span class="glyphicon glyphicon-download" aria-hidden="true"></span>
Export
<% end %>
推荐阅读
- android - 细化 3D 模型相对于增强图像姿势的位置
- c - 尾递归函数中的分段错误错误?
- java - 尝试将 Java 与数据库连接时出错
- c++ - 如何在 CMakeLists.txt 中指定源目录位置?
- c# - 如何捕获 ExtendedSocketException?
- entity-framework-6 - 实体框架 - 删除一个链接记录时删除连接表记录
- bash - 在 if 语句中使用子 shell 的 bash 脚本中 $LINENO 的奇怪行为
- python - 如何在 T/Z (ISO 8601) 时间戳格式中添加秒(mili、nano、micro)?
- hyperledger-fabric - 供应商链码具有错误的依赖关系
- sql - 在 postgresql 中返回 jsonb 标量的所有元素