2016-04-13 169 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

如果行爲不對,問題在於它沒有給我一個問題。 –