Частичное Ruby on Rails не будет обновляться с помощью AJAX, но говорит, что оно отображает частичное в консоли - PullRequest
0 голосов
/ 30 июня 2018

Я пытаюсь обновить таблицу в моем приложении на Rails 5. Он размещен в системе Linux CentOS 7 и доступен через мой браузер Firefox в Windows 7. Я провел много исследований и попробовал гем Rails-AJAX безрезультатно (этот драгоценный камень также сломал мои ссылки по некоторым причинам, поэтому я отключил его для сейчас). В моей консоли он утверждает, что выполняет рендеринг частичного после внесения изменений в базу данных, но это изменение не отражается до тех пор, пока я вручную не обновлю страницу в браузере.

Часть, которую я пытаюсь обновить, представляет собой целую таблицу, заполненную данными из базы данных, и в ней есть изображение индикатора включения / выключения в зависимости от того, говорит ли состояние в базе данных «включено» или «выключено». Это изображение - то, что я ищу, если таблица фактически обновляется. К сожалению, это изображение меняется только при обновлении вручную. Примечание. Svc / svc - это название модели / таблицы из используемой базы данных.

Это консольное сообщение, которое я получаю, нажимая кнопку «Пуск»:

Started GET "/boundbooks/1" for *IP ADDRESS* at 2018-06-29 17:51:10 -0400
Cannot render console from *IP ADDRESS*! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by BoundbooksController#startServer as JS
  Parameters: {"id"=>"1"}
  Svc Load (0.8ms)  SELECT  "svc".* FROM "svc" WHERE "svc"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
  ↳ app/controllers/boundbooks_controller.rb:26
   (0.2ms)  begin transaction
  ↳ app/controllers/boundbooks_controller.rb:30
  Svc Update (4.2ms)  UPDATE "svc" SET "STATUS" = ? WHERE "svc"."id" = ?  [["STATUS", "on"], ["id", 1]]
  ↳ app/controllers/boundbooks_controller.rb:30
   (23.8ms)  commit transaction
  ↳ app/controllers/boundbooks_controller.rb:30
  Svc Load (0.5ms)  SELECT "svc".* FROM "svc"
  ↳ app/views/boundbooks/_boundbooks_table.html.erb:8
  Rendered boundbooks/_boundbooks_table.html.erb (17.8ms)
Completed 200 OK in 83ms (Views: 36.3ms | ActiveRecord: 29.5ms)

Код из views / boundbooks / index.html.erb:

<div id="bb-table">
  <%= render partial: 'boundbooks_table', locals: { boundbooks: @boundbooks } %>
</div>
<br><br>

<% @boundbooks.each do |svc| %>
  <%= link_to 'Refresh', boundbookUpdate_path(:bb_id => svc.id), id: 'refresh-button', class: 'btn', remote: true %>
<% end %>

Да, я знаю, что кнопка обновления печатается несколько раз, но я не знал, как связать одну кнопку с базой данных.

HTML для частичной таблицы:

<table id="boundbooktable" border="1">
  <thead><th>Status</th><th>Name</th><th>IP Address</th><th>Port</th><th>Action</th></thead>
    <tbody>
      <%# btnCounter gives each button a different ID by incrementing at the end of the loop %>
      <% btnCounter = 1 %>
      <%# statusOn = true %>
      <%# creates a for-loop that utilizes the svc database table %>
      <% @boundbooks.each do |svc| %>
        <% status = svc.STATUS %>
        <tr>
          <td class="status-cell">
            <% if status == "on" %>
              <%= image_tag ("statusOn.png") %>
            <% else %>
              <%= image_tag ("statusOff.png") %>
            <% end %>
          </td>
          <td><%= svc.NAME %></td>
          <td><%= svc.IP %></td>
          <td><%= svc.PORT %></td>
          <td>
              <% if status == "off" %>
                <%= link_to "Start", boundbookStart_path(svc.id), id: 'start-button' + btnCounter.to_s, class: 'btn-start',
                            data: { confirm: "Start " + svc.NAME + "?" }, remote: true %>
              <% else %>
                <%= link_to "Start", boundbookStart_path(svc.id), id: 'start-button' + btnCounter.to_s, class: 'btn-start',
                            data: { confirm: svc.NAME + " is already on." }, remote: true %>
              <% end %>

              <% if status == "on" %>
                <%= link_to "Stop", boundbookStop_path(svc.id), id: 'stop-button' + btnCounter.to_s, class: 'btn-stop', remote: true,
                            data: { confirm: "ALERT: Stop " + svc.NAME + "?" }, onclick: 'myFunction()' %>
              <% else %>
                <%= link_to "Stop", boundbookStop_path(svc.id), id: 'stop-button-already-off' +btnCounter.to_s, class: 'btn-stop',
                            remote: true, data: { confirm: svc.NAME + " is already off." } %>
              <% end %>

              <%= link_to "Log", boundbooks_path, id: 'log-button' + btnCounter.to_s, class: 'btn btn-log', remote: true %>
          </td>
        </tr>
        <% btnCounter += 1 %>
      <% end %> <%# end for-loop going through database %>
    </tbody>
  </table>

Код для обновления контроллера скоросшивателей и методов startServer:

  def update
    @boundbooks = Svc.all

    @selected = Svc.where(:boundbook_id => params[:bb_id])
    respond_to do |format|
      format.js
    end
  end

  def startServer
    server = Svc.find(params[:id])

    if server.STATUS == "off"
      @boundbooks = Svc.all
      server.update_attribute(:STATUS, "on")
      refresh_dom_with_partial('div#bb-table', 'boundbooks_table')
      render partial: 'boundbooks_table', locals: { boundbooks: @boundbooks }
    else
      puts ">>>> >>>> >>>> Server already on"
    end
  end

Код JavaScript для AJAX в файле update.js.erb в папке представлений связанных книг:

$.ajax({ url: "boundbooks_controller/update",
         success: function() {
           $("#boundbookstable").html("<%= escape_javascript(render partial: 'boundbooks_table', locals: { boundbooks: @selected } ) %>");
         }});

это соответствующие маршруты в маршрутах. Rb:

  get '/welcome' => 'welcome#index'

  get '/boundbooks/:id/', controller: 'boundbooks', action: 'startServer', as: 'boundbookStart'

  get '/boundbooks/:id/edit', controller: 'boundbooks', action: 'stopServer', as: 'boundbookStop'

  get '/boundbooks/:bb_id/update' => 'boundbooks#update', as: 'boundbookUpdate'

  get '/boundbooks_controller/update' => 'boundbooks#update'

Как я могу получить это, чтобы действительно обновить таблицу должным образом?

1 Ответ

0 голосов
/ 30 июня 2018

Ваша ошибка кажется простой

вы пытаетесь изменить HTML-код div с идентификатором 'boundbookstable'

$("#boundbookstable").html(...

но в вашем html div имеет идентификатор 'boundbooktable'

<table id="boundbooktable" border="1">

просто убедитесь, что они одинаковы для обоих, измените html или js, но убедитесь, что они оба равны в обоих файлах.

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