javascript - 将工作的 Ruby on Rails 表单转换为 AJAX

标签 javascript jquery ruby-on-rails ruby ajax

我有一个工作的 Ruby on Rails 表单,它当前发布我的结果并将用户重定向到另一个 View 并发布结果。流程是:

views/tools/index.html.erb -> views/tools/ping.html.erb

因为我现在可以使用它,所以我想将它转换为 AJAX 并让用户保持在 views/tools/index.html.erb View 中,摆脱重定向以增强用户体验。但是,我不确定如何根据我的 Tools Controller 当前设置的方式进行操作,而且我对 AJAX 的知识非常缺乏。

所以,这是我目前拥有的:

views/tools/index.html.erb(在表单中添加了“remote: true”)

<h1> Tools </h1>

<h3> Ping </h3>

<%= form_tag ping_tool_path(1), method: "post", remote: true do %>
  <%= text_field_tag :ip, params[:ip] %>
  <%= submit_tag "Ping", name: nil %>
<% end %>

<!-- this is where I'd like to put the results via AJAX -->
<div id="output"></div>

controllers/tools_controller.rb

class ToolsController < ApplicationController

  def index
    
  end

  def ping
    ping_host(params[:ip])
    save_host(params[:ip])

    # Adds based on recommendations
    respond_to do |format|
     format.html { redirect_to tools_path }
     format.js
    end
  end


  protected

    def ping_host(host)
      f = IO.popen("ping -c 3 #{host}")
      @output = f.readlines

      tool_type = "ping"
      tool = Tool.find_by(tool_type: tool_type)
      tool.increment(:tool_hit_count, by = 1)
      tool.save

      @results = "<pre>#{@output.join}</pre>".html_safe
    end

    def save_host(host)
      host = Host.find_or_create_by(host_ip: host)
      host.increment(:host_hitcount, by = 1)
      host.save
    end
end

views/tools/ping.html.erb

<%= @results %>

views/tools/ping.js.erb(基于建议的新文件)

$("#output").html("<%= @results %>");

routes.rb

Rails.application.routes.draw do
  root 'tools#index'

  resources :tools do
    member do
      post 'ping'
    end
  end
end

这是我在提交表单后在 Google Chrome 的“网络”选项卡上看到的: Network Tab of Google Chrome

所以,我现在知道的是,我需要将 remote: true 添加到我在 views/tools/index.html 中的表单中.erb,这就是我迷路的地方。

似乎我有一个 ATM 问题,因为我已经抽象了表单以在 Tools Controller 中使用我的 ping 方法,而所有教程(和 railscasts)我经历过的是在 CRUD 方法和给定模型上执行 AJAX,而不是我到目前为止在这里构建的东西。 请帮助我理解 AJAX!

最佳答案

您的方向是正确的,现在您需要使用 respond_to block 修改 def ping 操作。

def ping
  ping_host(params[:ip])
  save_host(params[:ip])

  respond_to do |format|
    format.html { redirect_to tools_path } ## if you still want to have html
    format.js
  end
end

并创建一个名为 view/tools/ping.js.erb 的文件,其中包含将异步运行和返回的 javascript

$("#output").html("<%= j @results %>"); 

<%= %> block 将首先被评估并替换为该 ruby​​ 代码的输出。然后将其插入#output div。

关于javascript - 将工作的 Ruby on Rails 表单转换为 AJAX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34030385/

相关文章:

javascript - 为什么这个变量的值未定义

javascript - 如何将可观察到的类型转换为它的类型?

javascript - 用于 Web 音频 API 的数学相关 Javascript

javascript - 调用外部文件时 json 中出现“意外 token ”

ruby-on-rails - Ruby on Rails的before_filter和prepend_before_filter排序是?

ruby-on-rails - 覆盖 rails 中的默认脚手架 View 不起作用

javascript - 通过jQuery动态生成Drop Down列表的内容

jquery - 具有百分比高度和最小高度的模态

javascript - JSliderNews jQuery 插件通告

ruby-on-rails - AWS EC2 公钥