Есть ли способ заставить ActionCable отправлять данные по двум отдельным моделям, оставаясь на одной странице? - PullRequest
0 голосов
/ 15 июня 2019

У меня есть представление с формой ActionCable, которая работает как драгоценный камень. Однако недавно я добавил группу полей ввода, количество полей ввода определяется пользователем, эти поля ввода в настоящее время настроены на модели, отличной от текущей формы ActionCable.

Это для приложения турнира. Турнир -> Гонщик -> Lap Times

В этом турнире много гонщиков и много кругов в гонщике. Количество кругов в разных турнирах различается и определяется администратором турнира.

В настоящее время проблема заключается в том, что ActionCable отправит данные, но когда он отправляет данные круга, он следует по маршруту к действию в контроллере, который перемещается от страницы.

Мне требуется, чтобы и форма Racer, и форма Lap Time могли отправлять данные, не отходя от главной страницы.

Я перенес действие контроллера с контроллера LapTime на контроллер Racer и изменил маршрут.

Я также добавил redirect_to в этом контроллере, который указывает на действие show, но также вызывает перезагрузку страницы (не совсем то, что я хочу).

Кроме того, я попытался использовать рендер частичного цикла LapTime после отправки контроллером, но он по-прежнему вызывает перезагрузку страницы.

Я подумал о том, чтобы добавить тег <iframe> и загрузить в него цикл LapTime, но я не мог понять, как это сделать.

racers_controller.erb

def laps
  @lap_time_seconds = LeagueLap.secondizer(lap_params[:lap_time])
  tp = time_params2
  tp[:lap_time] = @lap_time_seconds
  @racer = Racer.where(id: params[:id]).first
  @lap = LeagueLap.where(id: params[:id]).first
  if @lap.update(time_params2)
    flash[:notice] = "Race was successfully updated"
    ActionCable.server.broadcast "racetime_channel",
    mod_message: racer_render(@racer)
  end
end

private

def racer_render(racer)
  render(partial: 'racer', locals:{racer: racer})
  end


  def time_params2
  @time_params ||= params.require(:league_lap).permit(:lap_time,:race_id, :league_id)
  end

show.html.erb

    <% league.racers.each do | racer | %>
          <%= form_for racer, remote: true,  :html =>{:class => 'ui large form racer-time', method: :put, multipart:true} do |f| %>
            <%= f.collection_select :user_id, User.order(:username),:id,:username, include_blank: false %>
            <label class="tgl" style="font-size:11px">
              <%= f.check_box :dns %>
              <span data-on="DNS" data-off="DNS"></span>
            </label>
            <%= f.hidden_field :id %>
            <%= f.submit class:'ui fluid small red submit button admin-save' %>
          <% end %>
          <% if @league_laps.present? %>
            <% @league_laps.each do |lap| %>
              <%= form_for lap, remote: true,  :html =>{:class => 'ui large form racer-time', method: :put, multipart:true} do |r| %>
                <%= r.text_field :lap_time, id:'lap_time_01', class:'time-field',onchange: 'this.form.submit();', :data => { "lap_time_01" => racer.lap_time_01 }  %>
                <%= r.text_field :race_id, class:'hidden', value: league.id %>
              <% end %>
            <% end %>
          <% end %>
          <% end %>

racetime.coffee

App.racetime = App.cable.subscriptions.create "RacetimeChannel",
  connected: ->
    # Called when the subscription is ready for use on the server

  disconnected: ->
    # Called when the subscription has been terminated by the server

  received: (data) ->
$('#participants').append data.mod_message
...