如果所需的密钥不存在,如何在不中断的情况下传递 link_to 中的参数?
Posted
技术标签:
【中文标题】如果所需的密钥不存在,如何在不中断的情况下传递 link_to 中的参数?【英文标题】:How do you pass params in a link_to without breaking if a required key is not present? 【发布时间】:2021-10-05 10:39:03 【问题描述】:首先,我得到了这个工作,但我想知道是否有更好的方法来做到这一点。
我有很多索引页面,用户可以在其中应用过滤器,然后将结果导出到 .csv
或 .xls
文件。
我所做的是将存在的任何params
(在应用过滤器之后)转发到再次查询数据库并将结果发送到构建文件的服务的控制器操作,如下所示:
link_to:
<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)
,但如果我这样做,根本不会传递任何参数。
【问题讨论】:
【参考方案1】:您应该将所有这些逻辑移至控制器或助手。
首先创建一个方法来挂载链接内发送的参数,这样您就不需要将其包装成条件
# 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 %>
【讨论】:
@pinkfloyd90 请记住,根据您的架构,这些方法可能存在于除controllers
或helpers
之外的其他地方。这只是一个如何从视图中提取逻辑的示例:)以上是关于如果所需的密钥不存在,如何在不中断的情况下传递 link_to 中的参数?的主要内容,如果未能解决你的问题,请参考以下文章
node.js 如何在不指定文件夹路径的情况下使用 index.js 解析所需的文件夹?
Mandelbrot 的算法在不使用复数的情况下无法给出所需的结果
了解特异性:在不使用 !important 的情况下实现所需的选择器结果 [重复]