質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

GET

GETとはHTTPが対応するリクエストメソッドの一つです。クライアントからサーバーへ送られたURLパラメータのデータを取得する時必要がある時に使われます。

パラメータ

関数やプログラム実行時に与える設定値をパラメータと呼びます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1526閲覧

Webrickでパラメータが取得出来ない

kinakoo

総合スコア5

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

GET

GETとはHTTPが対応するリクエストメソッドの一つです。クライアントからサーバーへ送られたURLパラメータのデータを取得する時必要がある時に使われます。

パラメータ

関数やプログラム実行時に与える設定値をパラメータと呼びます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/05/02 07:51

現在行っていること

Webrickで、フォームからパラメータを取得しようとしたら、以下のエラー文が表示されました。

ブラウザ

Internal Server Error undefined method `username' for #<Hash:0x00007fc3818a0ab0> WEBrick/1.4.2 (Ruby/2.6.3/2019-04-16) at localhost:8000

解決したいこと

usernameメソッドが見つからないとあるのでそれを紐付けたいです。
以下がコードです。

form.html

<html> <head> <meta http-equiv="content-type" charset="UTF-8"> </head> <body> <p>GETで送る</p> <form action="/get_form" method="GET"> <ul> <label for="username">ユーザー名:</label> <input type="text" id="username" name="username"> <br> <label for="userage">年齢:</label> <input type="text" id="userage" name="userage"> <br> <button type="submit" value="送信">送信</button> </ul> </form> <p>POSTで送る</p> <form action="/post_form" method="post"> <ul> <label for="username">ユーザー名:</label> <input type="text" id="username" name="username"> <br> <label for="userage">年齢:</label> <input type="text" id="userage" name="userage"> <br> <button type="submit" value="送信">送信</button> </ul> </form> </body> </html>

webrick.rb

# webrick.rb require 'webrick' server = WEBrick::HTTPServer.new({ :DocumentRoot => './', :BindAddress => '127.0.0.1', :Port => 8000 }) server.mount_proc("/time") do |req, res| body = "<html><meta charset='utf-8'><body>#{Time.new}</body></html>" res.status = 200 res['Content-Type'] = 'text/html' res.body = body end server.mount_proc("/get_form") do |req, res| body = "<html><meta charset='utf-8'><body>" body = "クエリパラメーターは#{req.query}です<br>" body = "こんにちは#{req.query.username}さん。あなたの年齢は#{req.query.userage}ですね" body = "</body</html>" res.status = 200 res['Content-Type'] = 'text/html' res.body = body end server.mount_proc("/post_form") do |req, res| req.query body ="<html><meta charset='utf-8'></body>" body = "フォームデータは#{req.query}です" body = "こんにちは#{req.query.name}さん</p><p>あなたの年齢は#{req.query.age}ですね" body = "</body></html>" res.status = 200 res['Content-Type'] = 'text/html' res.body = body end server.start

フォーム内容
イメージ説明

試したこと

form.htmlmethod="GET"を、違うとは思いながらmethod=usernameに変えてみましたがうまくいきませんでした。webrick.rbreq.query.usernameの書き方も自信がないので文法が間違っているのではないかとも考えました。
ご回答いただけると嬉しいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

req.query.usernameじゃなくてreq.query['username']ですね。他も同様。

また、bodyに文字列を継ぎ足していくのじゃ無くて、毎回上書きしているので、
最終的には、body = "</body></html>"の代入で上書きされ、その値だけになります。

さらに、初歩の勉強用だからいいですけど、このまだだと、XSSという脆弱性があります。

投稿2021/05/02 08:08

編集2021/05/02 09:19
otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問