如何正确管理 Sinatra 网页中的输入

How to properly manage inputs in a Sinatra web page

我正在开发一个超级简单的 Sinatra 应用程序用于演示目的,我想知道是否有更好的方法来实现它。

ruby程序超级简单(注:下面只贴出相关部分):

get '/' do
    redis = Redis.new
    redis = Redis.new(:host => settings.redis, :port => 6379)
    redis.incr("pageviews")

    @pageviews = redis.get("pageviews")
    @hostname = Socket.gethostname

    erb :webapp 
end #get /

post '/increase' do
    redis = Redis.new
    redis = Redis.new(:host => settings.redis, :port => 6379)
    redis.incr("pageviews")

    @pageviews = redis.get("pageviews")
    @hostname = Socket.gethostname
    redirect '/'

end #post /increase

然后我的html就更简单了(注:下面只贴了相关部分):

        <em style="color: blue; font-style: italic"> Views count (<%= @pageviews %>):</em>

        <form method="post" action="/increase">
            <input class='btn btn-primary' type='submit'>
        </form>

当您加载主页时,计数器增加 1。当您单击提交按钮时,计数器增加 2(一个是因为我提交的操作,另一个是因为重定向到主页)。没关系。这是我想要的。

但是,由于 Sinatra 的工作方式,当我按下“提交”按钮时,基本上整个页面都会重新加载。对于像这样的简单页面,它很好,但我担心对于更复杂的应用程序,重新加载整个网页可能是一项过于繁重的操作。当然不优雅。

我想知道我是不是试图过度拉伸 Sinatra(如果我想做那些事情,我应该切换到 Angular 之类的东西)或者我是否可以在 Sinatra 中使用一些方法来这样做 "increase" 而不必调用方法 + 重定向到 /

谢谢。

如果您不想重新加载整个页面,您有两个选择:要么使用 iframe(请不要使用 iframe),要么使用 JavaScript 中的后台通信机制,例如 AJAX 或 WebSockets。 Sinatra 可以轻松处理 AJAX 请求。现在,如果您希望 Sinatra 生成 JavaScript 代码来执行 AJAX 请求,就像某些 Web 框架所做的那样(例如 Angular),那么不,Sinatra 不会那样做.您必须自己实施 JavaScript 。专业提示:为此使用 jQuery,它会让您的生活更轻松。