2016-04-13 211 views
0

我正在演示一个应用程序,我正在教一个类并且遇到了一个错误。我在Sinatra应用程序中演示了POST请求。这里是我的路线:为什么这个`POST`请求​​工作并且不起作用

require "bundler/setup" 
require "sinatra" 
require "sinatra/reloader" 
first_names = [] 
get '/' do 
    @first_names = first_names 
    erb :index 
end 

post '/add_name' do 
    first_names << params[:first_name] 
    redirect "/" 
end 

index.erb

<h1>All Names</h1> 
<% @first_names.each do |name| %> 
    <div><%= name %></div> 
<% end %> 
<h2>Enter New Name Here and Hit Enter</h2> 
<form action="add_name" method="post"> 
    <input name='first_name'> 
    <input type="submit" value="Add First Name" 
</form> 

的Gemfile:

source 'https://rubygems.org' 

gem "sinatra" 
gem "sinatra-contrib" 

公告未关闭的标签input的形式。这实际上起作用。这很好,HTML是越野车?但是,让我出差的部分是,如果我将表格的action更改为addd_name(拼写错误)。它不会给我我所期望的错误。 “西纳特拉不知道这个蠢货......”它什么都不做。有什么想法吗?

+0

你确定它可以与缺少的结束标签一起工作吗(点击按钮,而不仅仅是按下回车键)?我认为发生的事情是,缺少的'>'导致浏览器将输入的两个属性':'(这是无效的)和'form'解析为关闭''(它似乎忽略了'/')。在HTML中,'input'元素可以有'form'属性,所以结果是submit按钮与一个不存在的表单相关联,而不是父表单,所以点击它有效。 – matt

+0

欢迎来到Stack Overflow。请阅读“[mcve]”。你的代码有语法错误;两个'first_names'的出现都是未定义的,但是'@ first_names'只能在你的'get'处理程序中分配。正如@matt所说的,你错过了后面的'>',但是浏览器可能能够做一些修正并正确渲染页面。尽管如此,你应该让HTML在语法上也是正确的。 –

+0

我只是把相关的代码,这是问题的一部分。我可以延长我的问题,我明白,我试图成为最小。 –

回答

0

如果您关闭输入标签,并尝试拼错行动'/addd_name'你会得到小曲错误:)

这这种情况下,浏览器不处理你的“形式”的一种形式。从开发者控制台检查你的网络标签。当你点击提交按钮时,你会看到没有任何反应。

顺便说一句,如果你还没有声明(例如在configure do ... end块)first_names数组,你会得到另一个错误 - nilClass或者那样。

+0

'first_names'刚刚在'app.rb'中实例化为一个空数组。 –

+0

现在你的例子没有问题。 –

+0

如果行为不对,问题在于它没有给我一个问题。 –