Форма фильтра выбирается с помощью ajax и rails - PullRequest
0 голосов
/ 27 августа 2018

Я смотрел много уроков на YouTube / Google и прочитал много вопросов здесь, но я не понимаю, как заставить мою Ajax form_with работать. У меня есть два выбора, это вместе с моим фильтром. Я выбрал смену и линию, а затем хочу иметь таблицу всех работников, которые работают на этой линии в течение смены. И тогда мне нужно выбрать со всеми тренировками, принадлежащими этой линии. Если я сделаю это «старым / простым» способом с параметрами и функциями, я смогу это сделать, но теперь я хочу, чтобы он был на одной странице с ajax без какого-либо перенаправления / перезагрузки. Кроме того, я на самом деле не хочу иметь две кнопки отправки. Я хочу, чтобы фильтр выбрал автоматическое обновление второй формы. Я пришел к выводу, если я делаю это с form_with это должно быть просто, потому что я не могу js. В настоящее время мой код, вероятно, беспорядок, но я надеюсь, что вы можете мне помочь.

add_worker_tm.js.erb

$("[data-placeholder~=tform]").html("<%= j render "tform" %>");

add_worker_tm.html.erb

    <% provide(:title, "Mitarbeiter hinzufügen") %>
<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= render "filter" %>
    <br><br>
    <%= render "tform" %>
  </div>
</div>

_filter.html.erb

<h1>Mitarbeiter hinzufügen</h1>
    <%= form_with url: add_worker_tm_trainings_path do |f| %>
      <%= f.label :schicht %>
      <%= f.collection_select :shift, Shift.all, :id, :name %>
      <%= f.label :linie %>
      <%= f.collection_select :line, Line.all, :id, :name %>
      <%= f.submit :submit %>
    <% end %>

_tform.html.erb

<div id="tform">
<%= simple_form_for(@trainingmem = Trainingsmembership.new, url: add_worker_tm_trainings_path) do |f| %>
  <div style="overflow: auto; height: 350px">
    <table>
      <tr>
        <th style="width: 25px"></th>
        <th style="width: 200px"><%= sort_link "name" %></th>
        <th style="width: 125px"><%= sort_link "position" %></th>
        <th style="width: 75px"><%= sort_link "Schicht" %></th>
        <th style="width: 100px"><%= sort_link "linie" %></th>
      </tr>
      <% @workerall.each do |worker| %>
        <tr>
          <td><%= check_box_tag "worker_ids[worker_ids][]", worker.id %></td>
          <td><%= worker.name %></td>
          <td><%= Position.find(worker.position_id).name %></td>
          <td><%= Shift.find(worker.shift_id).name %></td>
          <td><% worker.line_ids.each do |line| %>
              <%= Line.find(line).name %>
            <% end %></td>
        </tr>
      <% end %>
    </table>
  </div>
  <br><br>
  <%= f.input :training_id, collection: @trainings, label_method: :name, value_method: :id, label: 'Training:', include_blank: false %>
  <%= f.input :duration, label: 'Gültigkeit:' %>
  <%= f.input :date, :as => :string, :input_html => { data: {behaviour: "datepicker"}}, label: 'Prüfungstermin:' %>
  <!--#%= f.input :worker_id, collection: Worker.all, label_method: :name, value_method: :id, label: 'Mitarbeiter', include_blank: false, input_html: { multiple: false } %>-->
  <%= f.input :comment, as: :text, label: 'Bemerkung:' %>
  <%= f.input :attachement, as: :file, label: 'PDF-Protokoll:' %>
  <%= f.submit "Training bearbeiten", class: "btn btn-primary" %>
<% end %>
<script type="text/javascript">
    $('#micropost_picture').bind('change', function() {
        var size_in_megabytes = this.files[0].size/1024/1024;
        if (size_in_megabytes > 5) {
            alert('Maximum file size is 5MB. Please choose a smaller file.');
        }
    });
</script>
<script type="text/javascript">
    $('[data-behaviour~=datepicker]').datepicker({
        "format": "dd.mm.yyyy",
        "weekStart": 1,
        "autoclose": true
    });
</script>
</div>

trainings_controller

    def add_worker_tm
        @worker = Worker.new
        @workers = Worker.order("#{sort_column} #{sort_direction}")
        @workerall = Worker.all
        @trainings = Training.all
      end

      def addworkers_tm
        @workerall = Worker.order("#{sort_column} #{sort_direction}")
if params[:worker_ids].nil?
      flash[:error] = "Kein Mitarbeiter ausgewählt!"
      redirect_to add_worker_tm_trainings_path
      return
      end        
       @ws = params[:worker_ids].require('worker_ids')
        @trainings = Training.all
        @ws.each do |w|
          @tm = Trainingsmembership.new(tm_params)
          @tm.worker_id = w
          if @tm.save
            flash[:success] = "Mitarbeiter eingefügt"
            #redirect_to root_path
          else
            @tm.errors
            flash[:error] = "Fehler"
            render 'add_worker_tm'
            return
          end
        end
        redirect_to root_path
    end

маршруты

resources :trainings do
    collection do
      get 'add_worker_tm', to: 'trainings#add_worker_tm'
      post 'add_worker_tm', to: 'trainings#addworkers_tm'
    end
  end

Если я пытаюсь отправить свой фильтр, у меня появляется POST, но я не знаю, как изменить содержимое контроллера и объединить его с ajax. Вторая форма показывает все мои рабочие и тренинги вместо отфильтрованных.

EDIT:

Я сделал это с партиалами, так что мне просто нужно обновить партиалы. Я все еще не могу понять, что мне делать с моим контроллером для ajax и что мне не хватает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...