【问题标题】:HTML form to MongoDB via Ruby通过 Ruby 到 MongoDB 的 HTML 表单
【发布时间】:2017-10-09 12:06:57
【问题描述】:

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

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

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

现在我想使用 HTML 表单向数据库提交一个新用户。我的基本测试表格如下,位于 Sinatra 公共目录中,名为 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,我没有使用它。

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

更新 我显然在我的 Ruby 中犯了一个错误——它应该是 POST。于是我新建了一个 Ruby 块,当我直接从浏览器访问它并输入 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 不知道这个 Ditty”404。难道我没有使用 Sinatra 在 Views 文件夹中将 HTML 创建为 erb?我的页面位于 Public 文件夹中,独立于 Sinatra 编写。

【问题讨论】:

    标签: javascript ruby ajax mongodb sinatra


    【解决方案1】:

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

    【讨论】:

    • 谢谢 - 你是对的。我已将 Ruby 更新为 POST。但是当我提交表单时,我在 Sinatra 上不断收到 404 错误。
    • 嗯,我明白了。你确定你的网址是正确的吗?您可以尝试将 Sinatra 端点的完整路径分配给 actionurl 变量,如下所示:http://localhost:3000/api/v1/myTest。您可能还想检查您的端点是否正在使用例如邮递员或卷曲。
    • 我确实尝试使用完整的 URL,但它不起作用。我将不得不研究 curl 因为我不知道该怎么做。感谢您的提示!
    • Curl 可能看起来有点深奥;我会选择 Postman,它有一个很好的 gui,可以让你立即发出示例请求
    【解决方案2】:

    问题出在路线上,我猜。在 action = "/myTest" 的形式中,它确实应该是 "api/v1/myTest"。我一改它,它就开始工作了。

    感谢大家花时间帮助我。欣赏!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 2017-12-09
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      相关资源
      最近更新 更多