javascript - 通过 Ruby 将 HTML 表单发送到 MongoDB

标签 javascript ruby ajax mongodb sinatra

我正在尝试学习一项新技能,只是作为一种爱好,虽然我学到了很多东西,但仍然有一些事情让我感到困惑 - 这就是其中之一。

我设置了一个 MongoDB,其中包含 DB = 电话和集合 = 记录,正如您可能已经猜到的那样,它存储电话目录。我创建了一个 JSON 文件并导入了所有内容,一切顺利。

然后我创建了一个 Ruby/Sinatra 应用程序来显示表中的数据。这一切都很好。

现在我想使用 HTML 表单向数据库提交新用户。我的测试基本表单如下,位于 Sinatra 公共(public)目录中,名为 myTest.html

<form id="form">
    First name:<br>
    <input type="text" name="fname" value="Mickey">
    <br> Last name:<br>
    <input type="text" name="lname" value="Mouse">
    <br><br>
    <input type="submit" value="Submit" id="commit">
  </form>
  <script>

(我省略了 action="",因为我试图通过 AJAX 执行此操作,但它不起作用)这是我的 AJAX 尝试:

<script>
    $(function() {
      $.ajax({
        url: 'http://localhost:4567/api/v1/myTest',
        type: 'post',
        dataType: 'json',
        jsonp: 'json', // mongod is expecting the parameter name to be called "jsonp"
        success: function(data) {
          //console.log('success', data);
          console.log("Success");
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
          console.log('error', errorThrown);

        }
      });
    });

在我的 Ruby 文件phone.rb 中,我有以下内容:

get '/myTest' do
result = Record.collection.insert_one({ :fname =>"Justin"})
end

我已经验证这会起作用。

我遇到的困难是连接两者(或者我什至需要吗?)当我单击表单上的提交按钮时,我得到一个像这样的 URL 编码字符串:

localhost:4567/myTest.html?fname=Justin&lname=Smith

如何从表单中获取 URL 数据,并将其作为新文档插入到 Mongo 中?

我花了两天时间寻找答案,但网上几乎所有信息都以 Rails 的形式返回,但我没有使用它。我想先学会用 Ruby 做所有事情。当我从 Javascript 方面查看问题时,几乎所有引用都指向 Node.js,而我没有使用 Node.js。

任何帮助,或者至少是在正确的方向上的点头,我们将不胜感激。 谢谢

更新 显然我在 Ruby 中犯了一个错误 - 它应该是 POST。因此,我创建了一个新的 Ruby block ,当我直接从浏览器访问它并输入 localhost/api/v1/myTest?fname=Mickey&lname=Mouse 时,它​​将信息输入数据库

post '/myTest' do
fname = params[:fname]
  lname = params[:lname]
  Record.collection.insert_one({'fname' => fname, 'lname' => lname})
end

在表单上,​​我尝试添加以下内容:

<form id="form" method="POST" action="/myTest">
    First name:<br>
    <input type="text" name="fname">
    <br> Last name:<br>
    <input type="text" name="lname">
    <br><br>
    <input type="submit" value="Submit" id="commit">
  </form>
<script>
    $(function() {
      //hang on event of form with id=myform
      $("#form").submit(function(e) {

        //prevent Default functionality
        e.preventDefault();

        //get the action-url of the form
        var actionurl = '/myTest';


        $.ajax({
          url: actionurl,
          type: 'post',
          dataType: 'application/json',
          data: $("#form").serialize(),
          success: function(data) {
            console.log('success')
          }
        });

      });

    });
  </script>

我无法访问 Ruby/myTest。我不断收到“Sinatra 不知道这个小曲”404。是否我没有使用 Sinatra 在 Views 文件夹中将 HTML 创建为 erb?我的页面位于 Public 文件夹中,并且是独立于 Sinatra 编写的。

最佳答案

首先,在您的 javascript 代码中,您没有发送任何表单数据,即名字和姓氏(请参阅 jQuery $ajax docs )。其次,您尝试发送 POST 请求,而您的 Sinatra 应用程序定义了 GET 端点。一旦您确保您的 Sinatra 应用程序收到从 HTML 表单发送的正确数据,您就可以使用 mongo-ruby-driver 在 MongoDB 中轻松创建新记录。

关于javascript - 通过 Ruby 将 HTML 表单发送到 MongoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43899296/

相关文章:

javascript - 在不破坏内联 Javascript 的情况下缩小 HTML 代码

javascript - 我如何在我的 android 应用程序中使用 ThreeJS,或者是否有类似和强大的库像三个 js

ruby 字符串#unpack

javascript - 在 sweetalert 上显示文件的上传百分比(一个变量)

使用 ajax 时 JavaScript 循环行为异常

php - 连接多个表时,Ajax 不调用 php 查询

javascript - 如何在点击动画时更改 Angular 中的 css 样式

Ruby 在后台运行时无法读取 TCP 套接字

ruby-on-rails - 有没有办法覆盖 OmniAuth 默认配置?

javascript - 如何向单个组件添加多个指令