rails select_tag没有form_tag

时间:2015-11-16 09:45:57

标签: ruby-on-rails html-select

我有一个视图,显示链接到报告的按钮,我希望用户能够选择报告的排序列。

选择:

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

然后链接:

<%= 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传递给控制器​​的方向。 (如果可能的话)

由于

控制器:( 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

3 个答案:

答案 0 :(得分:1)

在您的视图中

<%= 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();
});

答案 1 :(得分:0)

您的PDF链接将无法从您的<select>下拉列表中进行访问。这不是链接在HTML中工作的方式。

据我所知,你只有两种选择。

  1. <select>标记和链接包含在<form>标记中,并将链接切换为按钮(如果需要,您仍然可以将其设置为类似CSS中的链接,如果需要,所以请使用<button>代码而不是<input type="submit">代码。

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

答案 2 :(得分:0)

为此,您需要 form_tag ,然后需要 submit_tag (而不是链接)。

另一种方法是创建两个明确传递select_sort_order的链接,隐藏其中一个,然后根据您选择的值切换显示每个链接(使用 onchange 事件)。这种方法不需要表格,也可以使用。

我会选择第一个选项,因为它更清洁。