diff --git a/202-webapp/app.rb b/202-webapp/app.rb index e844243..67133b4 100644 --- a/202-webapp/app.rb +++ b/202-webapp/app.rb @@ -21,12 +21,12 @@ end get '/users/*/*' do |name,touko| - "Hello, #{name}!" + "Hello,#{name}!" "君の#{touko}!一覧" #この1行しか出力されない。 end - get '/user/*/*' do |name,touko| - "#{name}さんこんにちは!君の#{touko}!一覧だよ" + get '/user/*' do |name| + "#{name}さんこんにちは!" end get '/usr/:name/:touko' do @@ -67,4 +67,6 @@ # => {"user_id"=>"gloria", "user_password"=>"HirabunDeHozonSuruna"} "#{params['user_id']} さんのパスワードは #{params['user_password']} です!" end + + \ No newline at end of file diff --git a/202-webapp/form.rb b/202-webapp/form.rb new file mode 100644 index 0000000..c04de15 --- /dev/null +++ b/202-webapp/form.rb @@ -0,0 +1,22 @@ +#-*- coding: utf-8 -*- + +require "sinatra" + +set :bind, "127.0.0.1" +set :port, 7190 + +get "/" do + # indexテンプレートを処理し返す + erb(:index) +end + +# サインインページ +get "/signin" do + # signinテンプレートを処理し返す + erb(:signin) +end + +# ユーザ名とパスワードが入力されたらそのまま返す +post "/auth" do + "ユーザ名は #{params["user_name"]} 、パスワードは #{params["pswd"]} ですね!" +end \ No newline at end of file diff --git a/202-webapp/views/index.erb b/202-webapp/views/index.erb new file mode 100644 index 0000000..0dca3e9 --- /dev/null +++ b/202-webapp/views/index.erb @@ -0,0 +1,11 @@ + + + + トップページ + + + +

トップページです!

+

サインインはこちら

+ + \ No newline at end of file diff --git a/202-webapp/views/signin.erb b/202-webapp/views/signin.erb new file mode 100644 index 0000000..fa1f6a1 --- /dev/null +++ b/202-webapp/views/signin.erb @@ -0,0 +1,15 @@ + + + + サインイン + + + +

サインイン

+
+

ユーザ名:

+

パスワード:

+ +
+ + \ No newline at end of file diff --git a/203-webapp/answers.db b/203-webapp/answers.db new file mode 100644 index 0000000..ab13e04 --- /dev/null +++ b/203-webapp/answers.db Binary files differ diff --git a/203-webapp/app.rb b/203-webapp/app.rb new file mode 100644 index 0000000..1f1031a --- /dev/null +++ b/203-webapp/app.rb @@ -0,0 +1,88 @@ +require 'sinatra' +require 'sqlite3' +# 乱数生成ライブラリを読み込む +require 'securerandom' + +db = SQLite3::Database.new('answers.db') +#db.results_as_hash = true #ハッシュ化。配列の何番とか分からないから。 + +# セッション機能を有効化 +enable :sessions +# セッション秘密鍵を生成 +# この鍵でセッション情報が署名され、ブラウザに返される。 +# Webアプリ再起動で鍵が新しくなってしまい全てのセッションが失われるため、 +# 固定したい場合はここを固定の秘密鍵に置きかえる。 +set :session_secret, SecureRandom.hex(64) + +# セッションの有効期限を30日に設定 +set :sessions, :expire_after => 60 * 60 * 24 * 30 + +# クッキーを他のドメインのWebサイトには送らない +set :sessions, :same_site => 'Strict' + +# 投稿された名前とメッセージの一覧を返す。 +get '/' do + # 名前とメッセージが未投稿のメッセージ以外をSELECTする + answers = db.execute(<<-SQL) + SELECT name, message + FROM answers + WHERE name IS NOT NULL + AND message IS NOT NULL; + SQL + erb(:answers, locals: {'answers' => answers}) +end + +get '/answers.json' do + # 名前とメッセージが未投稿のメッセージ以外をSELECTする + answers = db.execute(<<-SQL) + SELECT name, message + FROM answers + WHERE name IS NOT NULL + AND message IS NOT NULL; + SQL + json(answers) +end + +# 回答フォームを返す。 +get '/question/:answer_id' do + # get_first_rowメソッドで、SELECTした結果の最初の行だけを得る + # answer_idが正しければ {"answer_id"=>"リクエストされたID", "name"=>nil, "message"=>nil}、 + # 誤っていればnilになる + answer = db.execute(<<-SQL, answer_id: params['answer_id'])[0] + SELECT answer_id, name, message + FROM answers + WHERE answer_id = :answer_id; + SQL + + # もしDBに登録されていないanswer_idが来た場合、403を返し終了する。 + unless answer + halt 403 + end + + # セッションIDにanswer_idを追加。 + session['answer_id'] = answer['answer_id'] + + # 回答フォームを生成し返す。 + pp answer + erb(:question, locals: answer) +end + +# 回答を受信し、お礼ページを返す。 +post '/answer' do + # 正常なセッション情報を持たない場合、403を返し終了する。 + halt 403 unless session['answer_id'] + + # 入力された情報とセッションのanswer_idを元にDBを更新。 + db.execute(<<-SQL, answer_id: session['answer_id'], name: params['name'], message: params['message']) + UPDATE answers + SET name = :name, message = :message + WHERE answer_id = :answer_id; + SQL + + erb(:answer, locals: {'answer_id' => session['answer_id'] }) +end + +# なんらかのエラーが発生し、halt 403が呼ばれたらここに到達 +error 403 do + 'アクセスが拒否されました。' +end \ No newline at end of file diff --git a/203-webapp/counter.rb b/203-webapp/counter.rb new file mode 100644 index 0000000..162fa92 --- /dev/null +++ b/203-webapp/counter.rb @@ -0,0 +1,31 @@ +require 'sinatra' + +# 乱数生成ライブラリを読み込む +require 'securerandom' + +# セッション機能を有効化 +enable :sessions + +# セッション秘密鍵を生成 +# この鍵でセッション情報が署名され、ブラウザに返される。 +# Webアプリ再起動で鍵が新しくなってしまい全てのセッションが失われるため、 +# 固定したい場合はここを固定の秘密鍵に置きかえる。 +set :session_secret, SecureRandom.hex(64) + +# セッションの有効期限を30日に設定 +set :sessions, :expire_after => 60 * 60 * 24 * 30 + +# クッキーを他のドメインのWebサイトには送らない +set :sessions, :same_site => 'Strict' + +get '/' do + if session['count'] + # セッションの値countが設定されている場合は前の値に+1 + session['count'] += 1 + else + # セッションの値countが設定されていない場合は1を設定 + session['count'] = 1 + end + # ブラウザ側に返すメッセージ + "#{session['count']}回目のアクセスです!" +end \ No newline at end of file diff --git a/203-webapp/generate_url.rb b/203-webapp/generate_url.rb new file mode 100644 index 0000000..bff9236 --- /dev/null +++ b/203-webapp/generate_url.rb @@ -0,0 +1,29 @@ +#!/usr/bin/ruby + +require 'sqlite3' +require 'securerandom' + +BASE_URL = 'http://localhost:4567/question' + +db = SQLite3::Database.new('answers.db') + +# 回答を記録するテーブルanswersを作成する。 +# 既に存在する場合は何もしない。 +db.execute(< + + + 回答ありがとうございます! + + + + +

回答ありがとうございます!

+

すべての回答を見る

+

回答を修正する

+ + diff --git a/203-webapp/views/answers.erb b/203-webapp/views/answers.erb new file mode 100644 index 0000000..3d8a6a0 --- /dev/null +++ b/203-webapp/views/answers.erb @@ -0,0 +1,17 @@ + + + + すべての回答 + + + +

すべての回答

+
+ <% locals['answers'].each do |answer| %> +
<%= answer['name'] %>
+
<%= answer['message'] %>
+ <% end %> +
+ + + diff --git a/203-webapp/views/question.erb b/203-webapp/views/question.erb new file mode 100644 index 0000000..2cade26 --- /dev/null +++ b/203-webapp/views/question.erb @@ -0,0 +1,24 @@ + + + + 回答用フォーム + + + + +

解答フォーム

+
+
+ +
+
+ +
+
+ +
+
+ + diff --git a/204/Gemfile b/204/Gemfile new file mode 100644 index 0000000..098c0fb --- /dev/null +++ b/204/Gemfile @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +# gem "rails" + +gem "nokogiri", "~> 1.13" diff --git a/204/Gemfile.lock b/204/Gemfile.lock new file mode 100644 index 0000000..eaffaab --- /dev/null +++ b/204/Gemfile.lock @@ -0,0 +1,17 @@ +GEM + remote: https://rubygems.org/ + specs: + mini_portile2 (2.8.1) + nokogiri (1.13.10) + mini_portile2 (~> 2.8.0) + racc (~> 1.4) + racc (1.6.2) + +PLATFORMS + ruby + +DEPENDENCIES + nokogiri + +BUNDLED WITH + 1.17.2