Я пытаюсь получить Rails сформировать, которое я сделал:Rails AJAX к контроллеру метод
- сообщение к способу контроллера
- запустить команду,
- сохранить результаты в переменной,
- и показать их в
div
на той же странице.
У меня есть все, чтобы работать до сих пор, кроме последнего шага. Просматривая некоторые учебники AJAX, я не уверен, что я сделал неправильно или сейчас пропал без вести.
tools_controller.rb
def ping
ip = params[:ip]
tool_type = "ping"
f = IO.popen("ping -c 3 #{ip}")
@output = f.readlines
tool = Tool.find_by(tool_type: tool_type)
tool.increment(:tool_hit_count, by = 1)
tool.save
return @output
end
инструменты/index.html.erb
<%= form_tag ping_tool_path(1), method: "post", remote: true do %>
<%= text_field_tag :ip, params[:ip] %>
<%= submit_tag "Ping", name: nil %>
<% end %>
<h3> Output </h3>
<p>Not AJAX: <%= @output %></p>
<div id="#output"></div>
инструмент/ping.js.erb
document.getElementById("output").innerHTML = <%= @output %>
routes.rb
Rails.application.routes.draw do
root 'tools#index'
resources :tools do
member do
#get 'ping'
post 'ping'
end
end
end
Я подтвердил, что IO.popen(command)
работает путем добавления p @output
, который показывает, что это в Rails журнала и также успешно увеличивает HitCount для инструмента в БД:
Started POST "/tools/1/ping" for ::1 at 2015-12-01 12:24:14 -0500
Processing by ToolsController#ping as JS
Parameters: {"utf8"=>"✓", "ip"=>"10.10.10.1", "id"=>"1"}
["PING 10.10.10.1 (10.10.10.1): 56 data bytes"]
["PING 10.10.10.1 (10.10.10.1): 56 data bytes", "64 bytes from 10.10.10.1: icmp_seq=0 ttl=64 time=2.268 ms"]
["PING 10.10.10.1 (10.10.10.1): 56 data bytes", "64 bytes from 10.10.10.1: icmp_seq=0 ttl=64 time=2.268 ms", "64 bytes from 10.10.10.1: icmp_seq=1 ttl=64 time=2.425 ms"]
["PING 10.10.10.1 (10.10.10.1): 56 data bytes", "64 bytes from 10.10.10.1: icmp_seq=0 ttl=64 time=2.268 ms", "64 bytes from 10.10.10.1: icmp_seq=1 ttl=64 time=2.425 ms", "64 bytes from 10.10.10.1: icmp_seq=2 ttl=64 time=2.571 ms"]
["PING 10.10.10.1 (10.10.10.1): 56 data bytes", "64 bytes from 10.10.10.1: icmp_seq=0 ttl=64 time=2.268 ms", "64 bytes from 10.10.10.1: icmp_seq=1 ttl=64 time=2.425 ms", "64 bytes from 10.10.10.1: icmp_seq=2 ttl=64 time=2.571 ms", ""]
["PING 10.10.10.1 (10.10.10.1): 56 data bytes", "64 bytes from 10.10.10.1: icmp_seq=0 ttl=64 time=2.268 ms", "64 bytes from 10.10.10.1: icmp_seq=1 ttl=64 time=2.425 ms", "64 bytes from 10.10.10.1: icmp_seq=2 ttl=64 time=2.571 ms", "", "--- 10.10.10.1 ping statistics ---"]
["PING 10.10.10.1 (10.10.10.1): 56 data bytes", "64 bytes from 10.10.10.1: icmp_seq=0 ttl=64 time=2.268 ms", "64 bytes from 10.10.10.1: icmp_seq=1 ttl=64 time=2.425 ms", "64 bytes from 10.10.10.1: icmp_seq=2 ttl=64 time=2.571 ms", "", "--- 10.10.10.1 ping statistics ---", "3 packets transmitted, 3 packets received, 0.0% packet loss"]
["PING 10.10.10.1 (10.10.10.1): 56 data bytes", "64 bytes from 10.10.10.1: icmp_seq=0 ttl=64 time=2.268 ms", "64 bytes from 10.10.10.1: icmp_seq=1 ttl=64 time=2.425 ms", "64 bytes from 10.10.10.1: icmp_seq=2 ttl=64 time=2.571 ms", "", "--- 10.10.10.1 ping statistics ---", "3 packets transmitted, 3 packets received, 0.0% packet loss", "round-trip min/avg/max/stddev = 2.268/2.421/2.571/0.124 ms"]
Tool Load (0.1ms) SELECT "tools".* FROM "tools" WHERE "tools"."tool_type" = ? LIMIT 1 [["tool_type", "ping"]]
(0.0ms) begin transaction
SQL (0.2ms) UPDATE "tools" SET "tool_hit_count" = ?, "updated_at" = ? WHERE "tools"."id" = ? [["tool_hit_count", 24], ["updated_at", "2015-12-01 17:24:16.512580"], ["id", 1]]
(7.9ms) commit transaction
Rendered tools/ping.js.erb (0.1ms)
Completed 200 OK in 2034ms (Views: 3.8ms | ActiveRecord: 8.6ms)
Моя проблема на данный момент это то, что в представлении ничего не отображается. Что мне не хватает?
попробовать явно возвращая его – Beengie
@Beengie 'puts' был только для отладки цели, чтобы убедиться, что команда была фактически записывая что-то на консоль. – Godzilla74
Метод «ping» имеет более одной переменной. Поэтому я считаю, что вы должны явно вернуть тот, который вам нужен. – Beengie