У меня есть 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 используется для изменения значения #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 для того, чтобы подтолкнуть значения к моему действию commendations через событие "click", мое действие commendations будет вызываться дважды, поэтому возникает ошибка, потому что params [: employee_id] в действии теперь пуст.
Между прочим, мне нужны эти значения, потому что для меня важны действия по оценке, поэтому я могу заполнить свой PDF-отчет.
Пожалуйста помоги. Заранее большое спасибо!
→ Обновлено link_to:
<%= link_to 'COMMENDATION', '#', { id: 'commendations_click' } %>
→ Удалено dataType: "script" в обработчике событий #commendations_click
→ Обновлен url: в обработчике событий #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();
});
Сейчас работает отлично.
Приходят на ум две вещи. Вы можете обернуть два списка выбора в элементе формы и просто отправить. Все внутри формы будет отправлено на ваш сервер, и вы можете обработать запрос и обработать перенаправление на стороне сервера. Другая вещь, которую вы можете сделать, - обработать событие clickend commendations на стороне клиента, используя jquery или что-то в этом роде. Просто привяжите событие клика к этой ссылке, возьмите значения двух списков выбора и сделайте все, что хотите. Помните, что link_to просто отображается как простые старые html-ссылки на представлении. Например, для
link_to "Profile", profile_path(@profile) gets rendered as <a href="/profiles/1">Profile</a>