rails select_tag 没有 form_tag

rails select_tag without form_tag

我有一个视图显示 link 报告的按钮,我希望用户能够在其中 select 报告的排序列。

select:

<%= select_tag 'select_sort_order', "<option>fleet_num</option><option>rego</option>".html_safe %>

然后 link:

<%= link_to "PDF", current_vehicle_reports_path(format: 'pdf', select_sort_order: params[:select_sort_order]), target: "_blank" %>

目标是能够通过以下方式访问控制器中的值:

params[:select_sort_order]

据我所知,我没有从 params 中获得所需值的原因是缺少 form_tag。有人可以指出如何将值从 select_tag 传递给控制器​​的方向吗? (如果可能的话)

谢谢

controller:(if/else暂时测试)

def current
  @report = Report.new(current_user.filter_start_date, current_user.filter_end_date, current_user.vehicle_group_ids, current_user.vehicle_sub_group_ids, "Current Asset Register", false, true, "date_reported", 0, current_user.vehicle_type_ids, true )

  if params[:select_sort_order] == "fleet_num"
    @report.data = Vehicle.left_outer_join_vehicle_tables("sold = false #{@report.where_clause}").order(:fleet_num)
  else
    @report.data = Vehicle.left_outer_join_vehicle_tables("sold = false #{@report.where_clause}").order(:rego)
  end

  respond_to do |format|
    format.pdf do
      render :pdf => "#{__method__}"
    end
    format.xlsx
  end
end

您的 PDF link 将无法从 <select> 下拉菜单中访问。这不是 link 在 HTML 中的工作方式。

据我所知你只有两个选择。

  1. <select> 标签和 link 包装在 <form> 标签中并将 link 切换为按钮(您仍然可以设置样式如果你想看起来像 CSS 中的 link,如果是这样,请使用 <button> 标签而不是 <input type="submit"> 标签)。

  2. 使用 javascript 从下拉列表中获取值并将其附加到 link 标记,如下所示:?select_sort_order=....

要实现此功能,您需要 form_tag,然后是 submit_tag(而不是link).

另一种方法是创建两个 link 显式传递 select_sort_order,隐藏其中一个,然后根据 select 的值切换显示每个(使用onchange 事件)。这种方法不需要表格并且会起作用。

我会选择第一个选项,因为它更干净。

在您看来

<%= form_tag current_vehicle_reports_path, id: "report_form" do %>
    <%=   select_tag 'select_sort_order', "<option>fleet_num</option><option>rego</option>".html_safe %>
    <%= link_to "PDF", current_vehicle_reports_path(format: 'pdf'), id: 'report_id' %>
<%end %>

在 application.js 或其他 js 文件中

$('#report_id').click(function(e) {
    e.preventDefault();
    $('#report_form').attr('target', '_blank').submit();
});