【问题标题】:Can AJAX be used with Sinatra?AJAX 可以与 Sinatra 一起使用吗?
【发布时间】:2014-11-15 16:57:34
【问题描述】:

这已经被问过几次了,但是,网上似乎没有很好的答案。为避免不回答此问题的回复或链接,我将重新措辞。一个页面只有一个带有输入文本(和按钮)的表单。我们将文本发布到服务器,并希望它只是发回并发出警报。换句话说,视图应该有一行:

$.post(...,$("form").serialize(),function(reply){alert(reply);}); 

对于 PhP,答案是“回声”单行。这可以在 Sinatra 中完成吗?我知道后端框架是围绕自己处理 DOM 操作而构建的。我之所以问这个问题,是因为最好将 Ruby 等更具表现力的语言也用于数据库接口/后端逻辑。

编辑:这是/views/index.erb(用“/reply”代替“reply.php” - 否则为index.html/index.php)部分:

<script src="jquery"></script>

<form action="reply.php" method="post"><input type="text" name="t"></form> 

<script>
$(document).ready(function(){
   $("form").submit(function(event){
      event.preventDefault();
      $.post("reply.php",$("form").serialize(),function(reply){alert(reply);});
   });
});
</script>

注意event.preventDefault() 我们停留在/ 路线,不要进入/reply.php, 这将删除表单并仅打印提交的文本。换句话说,这是 是什么启用了 Ajax,我们从服务器收到回复(仅在警报中)reply.php:

echo $_POST["t"];

对于 Sinatra,我们需要一个 routes.rb 控制器:

require 'sinatra'

get '/' do
  erb :index
end

post '/reply' do
  ...
end

问题:使用index.html/reply.php,我们会收到带有已发布文本的警报。如何修改index.erb/routes.rb 以获得发布文本的警报?

【问题讨论】:

  • 是的,这可以在 Sinatra 中完成。但是,您似乎需要前端的某些特定帮助。这里没有足够的细节来判断你真正需要什么。我投票结束。
  • @Mark Thomas 我将我的问题从是/否编辑为如何。
  • 这是一个更好的问题。投票重新开放。

标签: jquery ruby ajax sinatra


【解决方案1】:

是的,这可以通过 Sinatra 完成。任何路由都可以从服务器返回数据给客户端;默认情况下,这是使用text/html mime 类型发送的,但您也可以使用适当的 mime 类型返回纯文本:

post "/reply.php" do
  content_type :text
  params['t']
end

如果您想回显多个值,可以使用this question 中的代码查看所有请求值。

这将从服务器发送回您的变量值,并且您在问题中的客户端 JavaScript 代码将导致 alert() 出现。

【讨论】:

  • 感谢您的回复!您建议的块有效,但需要一条路由来覆盖将回复传递给警报。如何使警报弹出?
  • @observer 您似乎对浏览器与服务器上发生的事情感到困惑。上面的“echo”是路线,可以是任何东西,例如“/api/v1/echo”。警报发生在浏览器中。无论 JS 调用后端 echo 服务,都会在浏览器中触发警报。
  • @Mark Thomas 我知道我们有 post "/route" do ... 以
    和 $.post("/route",.. 结尾.,...)。我的问题是:什么是触发警报的可能回声服务,还是因为框架是带有路由的刚性结构而不可能?
  • @observer 您是在问如何轮询 echo 服务,还是说您想要服务器发送的事件?顺便说一句,这与框架无关。
  • @observer 这个答案可以满足您的需求。事实上,您甚至可以将“echo”更改为“/reply.php”,而您与“PhP”一起使用的 javascript 将只适用于您复杂的单页应用程序;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
  • 2018-02-16
相关资源
最近更新 更多