如何使collection_select值成为link_to变量

时间:2014-01-06 15:07:35

标签: javascript jquery ruby-on-rails reporting

我有ff:

应用/视图/报告/ index.html.erb

<h1>Reports</h1>
<br>

<legend>Categories</legend>
<div class="row">
  <div class="span5">
    <ol>
      <li><%= link_to 'COMMENDATION', commendations_path(format: 'pdf'), { id: 'commendations_click' } %></li>

<%= collection_select(nil, 
                      :employee_id, 
                      @employees, 
                      :id, 
                      :last_name, 
                      {:prompt => "Select an Employee"}, 
                      {:id => 'employees_select'}) %>
<br>
<%= collection_select(nil, 
                      :employee_movement_id, 
                      @employeemovements, 
                      :id, 
                      :position, 
                      {:prompt => "-"}, 
                      {:id => 'employee_movements_select'}) %>

      <li><%= link_to 'REPORT2', '#' %></li>
      <li><%= link_to 'REPORT3', '#' %></li>
    </ol>
  </div>
</div>

<script type="text/javascript">
  $(document).ready(function() {
    $('#employees_select').change(function() {
      $.ajax({
        url: "<%= update_employee_movements_path %>",
        data: { employee_id : $('#employees_select').val() },
        dataType: "script"
      });
    });

    $('#commendations_click').click(function() {
      $.ajax({
        url: "<%= commendations_path %>",
        data: { 
          employee_id : $('#employees_select').val(),
          employee_movement_id : $('#employee_movements_select').val()
        },
        dataType: "script"
      });
    });
  });
</script>



应用/控制器/ reports_controller

class ReportsController < ApplicationController
  before_filter :authenticate_user!

  # GET /reports
  def index
    @employees = Employee.all
    @employeemovements = EmployeeMovement.distinct_positions
  end

  def update_employee_movements
    if params[:employee_id]
      @employeemovements = [].insert(0, "Select Employee Movement")
    else
      employee = Employee.find(params[:employee_id])
      @employeemovements = employee.employee_movements.map{ |a| [a.position, a.id] }.insert(0, "Select Employee Movement")
    end
  end

  def commendations
    emdates = EmployeeMovement.last_2_dates_obtained(params[:employee_movement_id])
    date_from = emdates[0].date_obtained
    date_to   = emdates.length == 1 ? nil : emdates[1].date_obtained
    emp = Employee.find(params[:employee_id])
    @commendations = case date_to.nil?
                     when true then emp.commendations.this_day_onwards(date_from)
                     else           emp.commendations.within(date_from, date_to)
                     end
  end
end




我在这里要做的是,我正在创建一个页面,其中包含链接和下拉列表,这些页面将用作报告中心。这个想法是,每个链接将由控制器提供。每个控制器都负责在浏览器中显示我的PDF(如果你很好奇,可以通过ThinReports)。

#employees_select change事件用于更改#employee_movements_select collection_select的值。

现在我的问题是,如何捕获#employees_select和#employee_movements_select的值并将它们传递给我的表彰行动?

我通过硬编码值测试了link_to,它可以工作(下面的代码)

<%= link_to 'COMMENDATION', commendations_path(employee_id: 1, employee_movement_id: 12, format: 'pdf') %>

但是,如果我使用javascript通过“click”事件将值推送到我的表彰操作,我的表彰操作将被调用两次,因此出现错误,因为操作中的params [:employee_id]现在为空。

顺便说一下,我需要这些值,因为我的表彰操作需要它,所以我可以填充我的PDF报告模板。

请帮忙。非常感谢提前!




更新1

- &GT;更新了link_to:

<%= link_to 'COMMENDATION', '#', { id: 'commendations_click' } %>

- &GT;删除了#commendations_click事件处理程序中的dataType:“script”

- &GT;更新了网址:#commendations_click事件处理程序

url: <%= commendations_path(format: 'pdf') %>




更新2(决议)

我调整了我的javascript看起来像这样:

$('#commendations_click').click(function() {
  event.preventdefault();
  window.location = "<%=j commendations_path(format: 'pdf') %>" + "?employee_id=" + $('#employees_select').val() + "&amp;employee_movement_id=" + $('#employee_movements_select').val();
});

现在完美无缺。

1 个答案:

答案 0 :(得分:0)

有两件事情浮现在脑海中。您可以在表单元素中包装两个选择列表,然后只进行提交。表单中的所有内容都将提交给您的服务器,您可以处理请求并处理服务器端的重定向。您可以做的另一件事是使用jquery或其他东西处理客户端上的表彰click事件。只需绑定到该链接的click事件,获取两个选择列表的值,并随意执行任何操作。请记住,link_to只是在视图上呈现为普通的旧HTML链接。对于例如

link_to "Profile", profile_path(@profile) gets rendered as <a href="/profiles/1">Profile</a>