как сделать значение collection_select как переменную link_to

0

У меня есть 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 используется для изменения значения #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-отчет.

Пожалуйста помоги. Заранее большое спасибо!




ОБНОВЛЕНИЕ 1

→ Обновлено link_to:

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

→ Удалено dataType: "script" в обработчике событий #commendations_click

→ Обновлен url: в обработчике событий #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();
});

Сейчас работает отлично.

Теги:
reporting

1 ответ

0
Лучший ответ

Приходят на ум две вещи. Вы можете обернуть два списка выбора в элементе формы и просто отправить. Все внутри формы будет отправлено на ваш сервер, и вы можете обработать запрос и обработать перенаправление на стороне сервера. Другая вещь, которую вы можете сделать, - обработать событие clickend commendations на стороне клиента, используя jquery или что-то в этом роде. Просто привяжите событие клика к этой ссылке, возьмите значения двух списков выбора и сделайте все, что хотите. Помните, что link_to просто отображается как простые старые html-ссылки на представлении. Например, для

link_to "Profile", profile_path(@profile) gets rendered as <a href="/profiles/1">Profile</a>
  • 0
    Привет, Махеш, спасибо тебе за ответ. Я проверю ваши предложения как можно скорее. Большое спасибо!
  • 0
    Привет @mahesh, я могу попросить пример на ваше второе предложение? Я пытался сделать это в javascript, но в итоге я дважды вызывал благодарственное действие за один клик ...
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню