首页 > 解决方案 > 如果所需的密钥不存在,如何在不中断的情况下传递 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)但根本没有传递任何参数。

标签: htmlruby-on-railspostgresqlparameters

解决方案


您应该将所有这些逻辑移至控制器或助手。

首先创建一个方法来挂载链接内发送的参数,这样您就不需要将其包装成条件

# 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 %>

推荐阅读