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

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

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

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

2232閲覧

current_user.admin?について

ina76

総合スコア10

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2019/05/15 15:38

###実現したいこと
view/posts/index.html.slimでcurrent_user.admin?を使えないのはなぜでしょうか。

発生している問題・エラーメッセージ

メソッドが見つかりませんと出ます

エラーメッセージ ActionView::Template::Error (undefined method `admin?' for nil:NilClass):

該当のソースコード

ruby

1@該当箇所 2- if current_user.admin? 3 = link_to '編集', edit_post_path(plan), class: 'btn btn-primary mr-3' 4 = link_to '削除', post,method: :delete, data:{confirm: "「#{post.title}」を削除します。よろしいですか?"}, class: 'btn btn-danger' 5 6@current_user指定場所(controllers/application_controller.erb) 7class ApplicationController < ActionController::Base 8 helper_method :current_user 9 10 11 private 12 13 def current_user 14 @current_user ||= User.find_by(id: session[:user_id]) if session[:user_id] 15 end 16end 17 18@posts_controllerのindexアクション 19 def index 20 @q = Plan.ransack(params[:q]) 21 @plans = @q.result(distinct: true).page(params[:page]).per(15).recent 22 end

試したこと

indexアクションに@user = User.find_by(params[:id])を追加して、
if current_user.admin?の部分を @user.admin?にしたらエラーが起きなくなった。

しかし、なぜcurrent_userだとadmin?メソッドが効かないのか。
また、view/users/index.html.slimではif current_user.admin?でエラーなく実装することができました。
それはなぜなのでしょうか。どなたかご教授いただけると幸いです。

補足情報(FW/ツールのバージョンなど)

Ruby version 2.6.3
Rails 5.2.3

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

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

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

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

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

asm

2019/05/15 17:02

> @user = User.find_by(params[:id]) posts/indexのparams[:id]ってユーザーIDなのでしょうか? 非ログイン時にもadmin判定されてそうな危うさを感じます。
ina76

2019/05/16 02:26

> asmさん おっしゃる通りで、postのidでした。 教えていただきありがとうございます。
guest

回答2

0

ベストアンサー

「current_userだとadmin?メソッドが効かない」ではなく「current_userがnilである」のが問題の本質だと思います。

コントローラから@current_userとして渡しているのであれば、@current_user.admin?とするのが正しいのではないでしょうか。

投稿2019/05/15 23:35

iwamot

総合スコア1154

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

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

ina76

2019/05/16 02:29

そういうことでしたか!本質的な問題は、nilだからなんですね。 @current_user.admin?でも例外が発生してしまったので、 nilの時に例外がでないようなメソッドを作って対応してみます! ありがとうございます!
guest

0

自己解決したので、ご報告させていただきます。
iwamotさんがおっしゃってた通り、current_userがnilであることで、admin?メソッドが使えず、例外が発生しておりました。

そこで下記のメソッドを定義し、if user_logged_in? && current_user.admin?とすることで例外がでなくなりました。

def user_logged_in?
!current_user.nil?
end

user_logged_in?メソッドは、もしcurrent_userがnilの場合は、falseを返すということなので、falseが発生した時点で、current_user.admin?は読み込まれなくなり、例外が発生しないということになります。

ご回答くださった皆さまありがとうございました。

投稿2019/05/16 02:53

ina76

総合スコア10

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

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

asm

2019/05/16 03:11

current_user&.admin? が個人的にはおすすめです。
ina76

2019/05/16 05:16

なるほど!ぼっち演算子を使うという手がありましたか!教えていただきありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問