Rubyでアカウントとパスワードを検証するプログラムの作成方法

このQ&Aのポイント
  • Rubyを使ってアカウントとパスワードをハッシュで検証するプログラムを作成したいがうまくいかない。どこを修正すれば良いか教えて欲しい。
  • accountData.txtにはアカウント名とパスワードが記述されている。入力したアカウント名とパスワードが一致した場合はログイン成功と表示し、一致しない場合はパスワードが間違っていると表示する。アカウント名が存在しない場合はアカウントが存在しないと表示する。
  • アカウントプログラムを作成中。条件分岐にif文を使用してアカウントとパスワードを検証し、ログイン結果を表示する予定。しかし、書いたコードが正しく動作しないため、修正方法を教えて欲しい。
回答を見る
  • ベストアンサー

アカウントプログラムについて

rubyでアカウントとパスワードを検証するプログラムを、ハッシュを使って作成しようと思っています。 そこで、if文を使って条件をわけようとしているのですが、うまくいきません。 自分なりに書いてはみたのですが間違っているようで、どこをどう直したらよいか教えていただきたいです! $KCODE = "e" hash_account = {} fo = open("accountData.txt", "r") i = 0 while(line = fo.gets) ary = line.split hash_account[ary[0]] = ary[1] i = i + 1 end fo.close print "*** ログインしてください。自分のアカウント名とパスワードを入力してください。 ***\n" print "アカウント:" account = gets.chop print "パスワード:" password = gets.chop if (hash_account[account] == password) print "ようこそ、", account,"さん。それではゲームを始めましょう。\n" elsif print "パスワードが間違っているようです。\n" else print account,"というアカウントはありません。\n" end ちなみに、accountData.txtには、アカウント名、パスワードの順に入っています。

  • Ruby
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

1:if (hash_account[account] == password) 2:rint "ようこそ、", account,"さん。それではゲームを始めましょう。\n" 3:elsif 4:print "パスワードが間違っているようです。\n" 5:else 6:print account,"というアカウントはありません。\n" 7:end 上記の3行目のelsif を elsif hash_account.has_key? account に変えてください。 そうすると正しく動きます。 尚、今後質問される場合はOS、rubyのバージョンも記述されたほうが より正確な回答が期待できます。

runa3829
質問者

お礼

無事、うまくいきました。 ありがとうございました!

関連するQ&A

  • cgiのプログラム

    前自分が質問したアカウントの管理についてなんですが、今度はそれをcgiプログラムに書き換えたいと思っています。そこで、ログインのページはできたのですが、認証できたかどうかのページがうまくいきませんでした。そこでなんですが、どう書き換えたらよいのでしょうか?? お願いします! ログインのページと認証のページのプログラムを両方書いておきます。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> <title>ログインページ</title> </head> <body> ログインしてください。<br> 自分のアカウント名とパスワードを入力してください。<br> <form method="GET" action="http://verify.cgi"> アカウント名: <input type="text" name="an"> <br> パスワード:<input type="password" name="pw" size="15"> <input type="submit" value="ログイン"> </form> </body> </html> #!/usr/local/bin/ruby print "Content-type: text/html; charset=euc-jp\n\n" $KCODE = "e" require "CGI" cgi = CGI.new account = cgi["an"] password = cgi["pw"] hash_account = {} fo = open("accountData.txt", "r") i = 0 while(line = fo.gets) ary = line.split hash_account[ary[0]] = ary[1] i = i + 1 end fo.close account = gets.chop password = gets.chop print <<EOS <HTML> <head> <meta http-equiv="content-type" content="text/html; charset=EUC-JP"> <title>アカウント認証</title> </head> <body bgcolor="skyblue"> EOS if (hash_account[account] == password) print "ようこそ、" #{account}"さん。それではゲームを始めましょう。" elsif hash_account.has_key? account print "パスワードが間違っているようです。" else print #{account}"というアカウントはありません。" end print <<EOS </body> </html> EOS 動作環境はruby 1.8.7 (2010-01-10 patchlevel 249) [i686-linux]になります。 よろしく、お願いします。

    • ベストアンサー
    • CGI
  • アカウントの登録について

    rubyでアカウントがない場合に新しくアカウントを作るプログラムを、ハッシュを使って作成しようと思っています。表示としては登録ができたら「アカウントを作成しました。」と、アカウントがすでにある場合には「アカウントはすでにあります。別なアカウント名を使ってください。」と表示させたいと思っています。ハッシュに登録まではできるのですが、そこからどう作成したらいいのかわからないので教えてほしいです!初心者で申し訳ないですがよろしくお願いします。 $KCODE = "e" hash_account = {} fo = open("accountData.txt", "r") i = 0 while(line = fo.gets) ary = line.split hash_account[ary[0]] = ary[1] i = i + 1 end fo.close ちなみに、accountData.txtにはアカウント名,パスワードの順に登録があります。 rubyのバージョンはruby 1.8.7 (2010-01-10 patchlevel 249) [i386-mswin32]です。

    • ベストアンサー
    • Ruby
  • アカウントのプログラムについて

    rubyのプログラミングでアカウントに関するプログラムでアカウントがある場合は成功しました、パスワード違う場合はもう一度入力してください、アカウントがない場合はアカウントがありませんと表示をさせようと思っています。ちなみに、アカウントデータはテキストファイルの中に、名前、パスワードの順番に入っています。 そこで何ですが、def verifyAccount(account, password)という関数の中身をどう定義したら良いのでしょうか? あと、result = verifyAccount(account, password)以降に何を書いたら良いか教えてもらえたら嬉しいです。 聞きたいことが多くて申し訳ないですが是非ともよろしくお願いします! def verifyAccount(account, password) end print "*** ログインしてください。自分のアカウント名とパスワードを入力してください。 ***\n" print "アカウント:" account = gets.chop print "パスワード:" password = gets.chop result = verifyAccount(account, password) ...

    • ベストアンサー
    • Ruby
  • rubyのプログラムについて

    rubyのプログラムで2~1000までの素数を列挙のものなんですがどこか違ってますか汗 考えたんですがよくわからなくて汗すみませんどなたかお願いします i=2 print "素数は\n" while i<=1000 do warukazu=2 flag=0 while warukazu<i do if i%warukazu==0 then flag=flag+1 warukazu=warukazu+1 else warukazu=warukazu+1 end end if (flag==0) then print i print"\n" end i=i+1 end

  • プログラムが動きません。

    プログラムが動きません。 ファイルuniqipにはIPアドレスが書き込まれています。そのファイルからIPアドレスを文字列ipに格納します。 ファイルtmp4には、85.114.143.2 34f4ff4acb18802170a939ae42dcd5ee0eeccda4 のようにIPアドレスとハッシュ値が書き込まれています。 tmp4に現れるIPアドレスで、uniqipに一致するものに対応するハッシュ値を printf("file%d,%s\n",i,hash); の形で出力しようと思いましたが、うまくいきません。 何がまずいのでしょうか? #include <stdio.h> #include <string.h> //ひとつのIPアドレスに現れるユニークなハッシュ値の数をカウントする int main() { FILE *fp,*gp; char ip[269730][16]; char ip2[16]; char hash[42]; int i,j; fp = fopen("uniqip","r"); if(fp == NULL){ printf("can not open the file.\n"); return 1; } for(i=0;i<267930;i++) { fscanf(fp,"%s",ip[i]); //printf("%s\n",ip[i]); } fclose(fp); ////////////////////////////////////////////////////////////////////////////////////////////////////// gp = fopen("tmp4","r"); if(gp == NULL){ printf("can not open the file.\n"); return 1; } for(i=0;i<267930;i++){ for(j=0;j<2470766;j++){ fscanf(gp,"%s %s",ip2,hash); printf("%s\n",ip[i]); if(!strcmp(ip[i],ip2)) { printf("file%d,%s\n",i,hash); } } } return 0; }

  • fetch_and_downcase

    配列から要素を取り出してその要素に含まれるアルファベットを小文字にして返す というメソッドなんですが・・・ def fetch_and_downcase(ary, index) if str = ary[index] return str.downcase end end ary = ["Boo", "Foo", "Woo"] p fetch_and_downcase(ary, 1) hash = { 0 => "Boo", 1 => "Foo", 2 => "Woo"} p fetch_and_downcase(hash, 1) ↑の内容だとうまく実行できるのですが hash = { :0 => "Boo", :1 => "Foo", :2 => "Woo"} p fetch_and_downcase(hash, :1) ↑のようにハッシュのキーをシンボルにしたり、文字列にすると エラーがでます。 何故でしょうか? ハッシュも要素を参照するときに hash[index] の形式で参照できるので、キーがシンボルであっても うまくいくと思ったのですが、キーが数字でないとうまく 動いてくれません・・・

    • ベストアンサー
    • Ruby
  • 参照配列の要素数の求め方は?

    リファレンス配列の要素数は、$#では求められないのでしょうか? ------------------------------------- foreach $i(0 .. 3){ $hash->[$i] = $i * 100; } print "\%hashの要素数->$#hash\n"; $ref = \%hash; print "\%{$ref}の要素数->$#{$ref}\n"; -------------------------------------

    • ベストアンサー
    • Perl
  • Array#eachのブロック中で要素追加

    初歩的な質問で申し訳ありません ary = [Foo.new] ary.each do |i|  if (条件)   ary.push(Foo.new)  end end 上の様にブロックの中である条件でaryに要素が追加されます。 この場合、この追加された要素はeachで漏れなく扱えるのでしょうか? 簡単なプログラムで試した限りではpushされたFooインスタンスについてもeachで取り出せているようなのですが、自信が無いので質問致します。 # coding: windows-31J class Foo attr_accessor :checked attr_reader :val RAND_MAX = 5 def initialize rnd = Random.new @checked = false @val = rnd.rand(RAND_MAX).to_i end end ary = [Foo.new] ary.each do |f| if f.val > 0 ary.push(Foo.new) end f.checked = true end cnt_true = 0 cnt_false = 0 ary.each_index do |idx| print "#{idx} #{ary[idx].checked} #{ary[idx].val}\n" if ary[idx].checked cnt_true += 1 else cnt_false += 1 end end puts "checked true = #{cnt_true}" puts "checked false = #{cnt_false}" よろしくお願いします。

    • ベストアンサー
    • Ruby
  • プログラム実行中に強制停止させる方法

    再び失礼します。 現在以下のようなソースコードを実行しています。 while true do print "commando?\n" command = gets if command == "end" then break end end ループから抜け出すために、getsメソッドを用いて、 endと入力されればループを抜けるという感じにしたいのですが うまく抜け出せず、無限ループに陥ってしまいます。 質問内容は、このように、getsメソッド実行中(?)にプログラムの強制停止を したいのですが、そのような方法はありますでしょうか。(例えばctrl+???とか) 実行環境は、terapadを使用してソースコードを書き、rubyコマンドプロンプトで rubyコマンドを使って実行しています。 それではよろしくお願いいします。 ※投稿確認したのですが、ソースコードにうまくインテンドが挿入されていません・・ 見づらくて申し訳ございません

    • ベストアンサー
    • Ruby
  • プログラムの意味がわからなくて困っています

    こんにちは。以下のプログラムの意味がわからなくて困っています。分数q/p(p、qはともに正の整数)に関係するもので、3/13を入力したときの出力と、配列R()がどんな変化をしていくかを教えてください。 100 option base 0 110 dim A(1000) 120 dim R(999) 130 let N=1000 140 for I=0 to N-1 150 let R(I)=0 160 Next I 170 do 180 print"分母p="; 190 input P 200 if (P>N) then 210 print"分母は1000以下にしてください” 220 end if 230 loop while(P>N) 240 print"分子q="; 250 input Q 260 let A(0)=int(Q/P) 270 let Q=mod(Q,P) 280 let K=0 290 Do 300 let K=K+1 310 let R(Q)=K 320 let Q=Q*10 330 let A(K)=int(Q/P) 340 let Q=mod(Q,P) 350 loop while (R(Q)=0) 360 print A(0);"."; 370 for I=1 to R(Q)-1 380 print A(I); 390 next I 400 if (R(Q)<K) or (A(K)<>0) then 410 print "{"; 420 for I=R(Q) to K 430 print A(I); 440 next I 450 print"}"; 460 end if 470 end 100から160までで配列Aを1000個、配列Rを999個準備し、配列Rの中身を0にしている。 170から230で分母Pに13を入れ分母が1000以下になることを確認している。1000以上であれば、1000以下になるまでループ内を繰り返す。 240以下で分子を入れているようですが、ここからよくわからなくなってしまいました。 よろしくお願いします。  

専門家に質問してみよう