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

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

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

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

Q&A

解決済

2回答

1864閲覧

条件分岐 if文の書方

takeke

総合スコア60

Ruby

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

0グッド

0クリップ

投稿2018/05/09 12:49

if文の書方について質問させてください

現在ログインの際に管理者権限ある人と一般の人のリダイレクト先を変えたいのですがif文がうまく機能しません。

管理者権限のある人と一般の人との違いは、usersテーブルにあるadminカラムがtrueかfalseで区別しています。

そこでログインのsession_controller.rbでこう書いています

def create user = User.find_by_name(params[:name]) if user and user.authenticate(params[:password]) && user.admin == "false" session[:user_id] = user.id   redirect_to store_url   elsif user and user.authenticate(params[:password]) && user.admin == "true"     session[:user_id] = user.id     redirect_to admin_url else redirect_to login_url, alert: "無効なユーザー/ パスワードの組み合わせです" end end

これだと全てelseの結果になってしまいました。

試しにifではなくcase使ってみました

def create user = User.find_by_name(params[:name]) case user and user.authenticate(params[:password]) when user.admin(params[:admin]) == "false" session[:user_id] = user.id redirect_to store_url when user.admin(params[:admin]) == "true" session[:user_id] = user.id redirect_to admin_url else redirect_to login_url end end

こうすると違うエラーが出てしまいました

ArgumentError (wrong number of arguments (given 1, expected 0)): app/controllers/sessions_controller.rb:25:in `create'

以上なのですが、どのように書いたらよいでしょうか?よろしくお願いしますm(._.)m

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

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

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

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

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

guest

回答2

0

ベストアンサー

動作が期待と違った原因は set0gut1 さんの回答のとおりでしょうね。

デバッグのやり方ですが,

rb

1user = User.find_by_name(params[:name])

の行の次に byebug を仕込んで,user.adminuser.authenticate(params[:password]) などの値を確認します。

ところで,原因がそれであったとしたら,以下のように整理できると思います。

rb

1def create 2 user = User.find_by_name(params[:name]) 3 if user && user.authenticate(params[:password]) 4 session[:user_id] = user.id 5 if user.admin 6 redirect_to admin_url 7 else 8 redirect_to store_url 9 end 10 else 11 redirect_to login_url, alert: "無効なユーザー/ パスワードの組み合わせです" 12 end 13end

投稿2018/05/09 14:16

scivola

総合スコア2108

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

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

takeke

2018/05/11 09:00

回答ありがとうございました!デバッグのやり方がよくわからなかったのですが、とりあえずターミナル内byebugが表示された所でuser = User.find_by_name(params[:name])ではnilでした。 それと、大きなミスが発覚しまして、現在のデータにはadmin=trueなユーザーが1人も存在しませんでした。こちらは登録した後にrails c コマンドにてターミナルで値を入れたのですが、その際に.saveするのを忘れていてそのままになっていたようです。 そこでもう一度元の記述で試した所、結局同じ結果だったのですが、 回答で頂いたコントローラーの記述を試した所、正常に動作できました! 原因はset0gut1さんのおっしゃる通り=="" の書方がいけなかったようです。 この度はありがとうございました!助かりましたm(._.)m
guest

0

一つ目のコード、書式は正しそうに見えます。
実物が手元にないので勘でのレスになってしまうのですが、

  • user.admin == "false"
  • user.admin == "true"

ひょっとして真偽値と文字列を比較しているのではないでしょうか。
true == "ture"falseになるので、そこが一番疑わしく感じました。

投稿2018/05/09 14:07

set0gut1

総合スコア2413

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

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

takeke

2018/05/11 08:47

回答ありがとうございました!確かにその可能性高そうです原因は正直正確にはわからなかったのですが、なんとか解決できました。アドバイスありがとうございました!
set0gut1

2018/05/11 08:47

解決できましたか!おめでとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問