2016-04-13 12 views
0

私が教えていたクラスのアプリをデモしていて、バグに遭遇しました。私はSinatraアプリケーションでPOSTリクエストをデモしていました。 index.erbなぜこの「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 

<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はバグですか?しかし、フォームのactionaddd_name(間違っている)に変更すると、私のところに飛びつく部分があります。私には間違いがありません。 "シナトラはこのディディを知らない..."ただ何もしない。何かご意見は?

+0

終了タグがない(Enterを押すだけではなく、ボタンをクリックして)機能していますか?私は何も起こっていないと思うのは、 '>'が見つからないということは、ブラウザが ''という入力を2つの属性として解析する原因になっていると思います。これは無効です。 '/') HTMLでは、 'input'要素は' form'属性を持つことができます。その結果、送信ボタンは親フォームの代わりに存在しないフォームに関連付けられているので、それをクリックすると効果があります。 – matt

+0

スタックオーバーフローへようこそ。 「[mcve]」をお読みください。コードに構文エラーがあります。 'first_names'の両方の出現は未定義ですが、' @ first_names'は 'get'ハンドラでのみ割り当てられます。 @mattによれば、 '>'の行末が見当たりませんが、ブラウザはいくつかの修正を行い、ページを正しくレンダリングできるかもしれません。それでも、HTMLを構文上正しいものにする必要があります。 –

+0

私はちょうど問題の一部である関連コードを入れました。私は私の質問を拡張することができます、私は理解して、私は最小にしようとしていた。 –

答えて

0

あなたはinputタグを閉じて、あなたはその小唄のエラーが発生します'/addd_name'としてアクションのスペルを間違えしよう:)

それはその場合、ブラウザはフォームのように、あなたの「フォーム」を処理しません。デベロッパーコンソールからネットワークタブを確認してください。送信ボタンをクリックしても何も起こらないことがわかります。

Btw、first_names配列を宣言していないと(たとえばconfigure do ... endブロック)、別のエラー、nilClassまたはsthが発生します。

+0

'first_names'は' app.rb'で空の配列としてインスタンス化されます。 –

+0

あなたのサンプルは問題なく動作します。 –

+0

アクションが間違っていない場合、問題はそれが私に問題を与えていないということです。 –

関連する問題