2015-12-01 2 views
0

Я пытаюсь получить Rails сформировать, которое я сделал:Rails AJAX к контроллеру метод

  1. сообщение к способу контроллера
  2. запустить команду,
  3. сохранить результаты в переменной,
  4. и показать их в 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)

Моя проблема на данный момент это то, что в представлении ничего не отображается. Что мне не хватает?

+0

попробовать явно возвращая его – Beengie

+0

@Beengie 'puts' был только для отладки цели, чтобы убедиться, что команда была фактически записывая что-то на консоль. – Godzilla74

+0

Метод «ping» имеет более одной переменной. Поэтому я считаю, что вы должны явно вернуть тот, который вам нужен. – Beengie

ответ

0

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

def ping 
    ip = params[:ip] 
    tool_type = "ping" 

    @output = [] 
    IO.popen("ping -c 3 #{ip}").each do |line| 
     @output << line.chomp 
     p @output 
    end 

    # this just updates the Tool hitcount in the DB 
    tool = Tool.find_by(tool_type: tool_type) 
    tool.increment(:tool_hit_count, by = 1) 
    tool.save 

    return @output # Explicitly return the variable 
    end 

Вы явно хотите это в конце, так что вы не пропустите ваши tool события.

У вас нет ничего с идентификатором «выход», чтобы положить его в.

<p>Not AJAX: <span id='output'></span></p> 

Я думаю, что теперь вам придется вытащить промежуток в частичное затем вызвать его с помощью JavaScript.

# Replaces all contents... 
$('#output').html("<%= j render(:partial => 'output') %>"); 

# Will append the contents... 
$('#output').append("<%= j render(:partial => 'output') %>"); 

... Затем в _output.html.erb папке просмотров/инструменты

= @output 
+0

Добавлен возврат, однако все еще не отображается в представлении. Возможно ли, что AJAX стреляет до завершения процесса ping, поэтому отображается переменная, в которой ничего нет? – Godzilla74

+0

или другой (я не знаю AJAX) думал ... может ли моя проблема быть в том, что '@ output' находится в методе' ping', тогда как я обрабатываю 'index.html.erb'? – Godzilla74

+0

сделал это заставлять его работать? – Beengie

Смежные вопросы