我有ff:
<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>
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报告模板。
请帮忙。非常感谢提前!
- &GT;更新了link_to:
<%= link_to 'COMMENDATION', '#', { id: 'commendations_click' } %>
- &GT;删除了#commendations_click事件处理程序中的dataType:“script”
- &GT;更新了网址:#commendations_click事件处理程序
url: <%= commendations_path(format: 'pdf') %>
我调整了我的javascript看起来像这样:
$('#commendations_click').click(function() {
event.preventdefault();
window.location = "<%=j commendations_path(format: 'pdf') %>" + "?employee_id=" + $('#employees_select').val() + "&employee_movement_id=" + $('#employee_movements_select').val();
});
现在完美无缺。
答案 0 :(得分:0)
有两件事情浮现在脑海中。您可以在表单元素中包装两个选择列表,然后只进行提交。表单中的所有内容都将提交给您的服务器,您可以处理请求并处理服务器端的重定向。您可以做的另一件事是使用jquery或其他东西处理客户端上的表彰click事件。只需绑定到该链接的click事件,获取两个选择列表的值,并随意执行任何操作。请记住,link_to只是在视图上呈现为普通的旧HTML链接。对于例如
link_to "Profile", profile_path(@profile) gets rendered as <a href="/profiles/1">Profile</a>