前提・実現したいこと
sinatraで下記のコードのように、ローカルでsinatra.rbを起動し、その後request.rbを実行することで、getリクエストでパラメータを渡してログインしたのち、postリクエストでログイン情報を変更したいと考えております。
sinatra.rbでは、sessionを利用して、ログイン情報変更をしようと思っているのですが、postすると、sessionが切れてしまいます。
具体的に言うと、get "/login"
の段階では、session[:id]
にid
が入っているのですが、post "/edit"
ではsession[:id]
はnil
になっています。
post "/edit"
でもsession[:id]
が引き継がれるようにしないのですが、原因と対応策をご教授いただけないでしょうか。
該当のソースコード
sql
1CREATE TABLE `users` ( 2 `id` int(11) NOT NULL AUTO_INCREMENT, 3 `user_id` varchar(100) DEFAULT NULL, 4 `password` varchar(100) DEFAULT NULL, 5 PRIMARY KEY (`id`), 6 UNIQUE KEY `user_id` (`user_id`) 7) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4;
ruby
1# request.rb 2 3require_relative "common" #必要なライブラリ群 4 5def get(route, params) 6 uri = URI.parse("http://localhost:4567/#{route}#{params}") 7 8 response = Net::HTTP.get_response(uri) 9 10 response.body 11end 12 13def post(route, params) 14 uri = URI.parse("http://localhost:4567/#{route}") 15 request = Net::HTTP::Post.new(uri) 16 request.set_form_data(params) 17 18 req_options = { 19 use_ssl: uri.scheme == "https", 20 } 21 22 response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http| 23 http.request(request) 24 end 25 26 response.body 27end 28 29get("login", "?id=a&password=a") 30 31post("edit", {id: b, password: b}) 32 33 34#sinatra.rb 35 36require_relative "common" #DB接続設定など 37require 'sinatra' 38require 'sinatra/reloader' 39require 'active_record' 40 41class User < ActiveRecord::Base 42end 43 44use Rack::Session::Cookie 45 46get "/login" do 47 content_type :json 48 id = params['id'] 49 password = params['password'] 50 data = {} 51 52 return nil if !User.exists?(user_id: id) 53 user = User.find_by(user_id: id) 54 if user.password == password 55 data["user_id"] = user.user_id 56 session[:id] = user.id #ここではidが入力されている 57 end 58 data.to_json 59end 60 61post "/edit" do 62 content_type :text 63 p session[:id] #loginしてもnilになってしまう 64 return nil if session[:id].nil? 65 user = User.find(session[:id]) 66 id = params['id'] 67 password = params['password'] 68 user.update(user_id: id) 69 user.update(password: password) 70 return "done" 71end 72
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー