如何从没有html / view的页面重定向用户?

时间:2016-08-14 20:15:46

标签: javascript json sinatra http-redirect

我正在做一个挑战,它使用Sinatra和Javascript以及一个JSON文件作为数据库(各种各样)并且遇到了一个障碍,这让我疯狂了两天。问题是我希望能够在成功提交后将用户保持在与/homepage形式相同的页面上(或自动重定向它们),并从那里通知他们成功提交。实际发生的是,一旦我提交表单,用户就被重定向到(POST) '/'路由(并保持在那里) - 但是没有与该端点关联的视图。显示的是服务器端消息。

这是config.ru:

##QUERY THE USERS LIST
get "/" do
  protected!
  File.open("./test-users.json").read
end

##ADD A NEW USER
post "/" do
  protected!
  param :name, String, required: true
  param :email, String, required: true, format: /^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$/

  contents = File.open("./test-users.json").read
  parsed_contents = JSON.parse(contents)
  File.delete("./test-users.json")
  parsed_contents["guests"] << {"email" => params["email"], "name" => params["name"]}
  File.open("./test-users.json", "w+") do |f|
    f.puts JSON.pretty_generate(parsed_contents)
  end

  "#{params['name']} now signed up with #{params['email']}"
end

现在,我不允许修改该文件或(这会更容易!)。这是我的表格:

  <div class="sidebar-left col-xs-12 col-sm-4">
    <form action="/" method="POST" id="registrantForm">
      <h1>Please Register</h1>
      <input type="text" name="name" id="register-name" placeholder="username" required>
      <input type="email" name="email" id="register-email" placeholder="email" required>
      <input type="submit" value="Submit">
      <div id="form-error" class="error"></div> 
    </form>
  </div>

以下是我尝试过的一些事情,

  • 检测当前window.location,如果是'/',则重定向回。这不起作用,因为一旦你在'/'路线上 - 你不再在html页面上,所以javascript不起作用。

  • 使用onbeforeunload进行游戏,但这不起作用,因为我无法访问目标路由,并意识到即使我这样做,如果我从{{1}重定向,我也会阻止提交在提交完成之前。

  • 从html中提取表单并进入JS以尝试在提交后控制路由(使用onload事件),但是我无法将数据发送到发送params as query string或stringified object:

'/'

或者不使用function submit(emailInput, nameInput){ var params = { email: emailInput, name: nameInput }; request.open("POST", "http://localhost:9292", true); request.send(JSON.stringify(params)); request.onload(function(){ window.location.assign('http://localhost:9292/homepage'); }); } 发送参数,因为它似乎从网址的搜索查询中抓取了它。两者都导致页面在提交时重新加载而没有重定向到request.send(),但是没有保存数据。

如何在成功提交表单数据的同时将用户重定向回'\'路由?这个设置有可能吗?

1 个答案:

答案 0 :(得分:1)

  

执行此操作的最简单方法可能是使用js替换表单操作,只需使用js提交值 - 这样就不会发生重定向

这正是它的工作原理。所以我构建了一些示例代码来证明它并解释它。 (提示:我使用jQuery只是为了方便你可以在普通的js中这样做)

registration_access

侧面注意ruby代码有很大的潜力可以做得更好。