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

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

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

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

Ruby on Rails

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

Q&A

1回答

3516閲覧

railsチュートリアルの@current_userとcurrent_userについて

voodoochildtan

総合スコア12

Ruby

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

Ruby on Rails

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

0グッド

1クリップ

投稿2019/07/01 13:59

railsチュートリアルの10章のことです。unless以下のcurrent_userがしっくりきません。

まず第一に、current_userメソッドが呼び出されていると言う認識で良いのでしょうか? もしそうであれば、current_userメソッドを呼び出し、最後に評価された値が返り値になるというrubyの性質を利用しているだけなのでしょうか。一度変数に入れてから比較した方が読みやすい気がするのですが、どんな理由があるのかイマイチわかりません。

また、@current_userとなっておらず、current_userとなっていることもよくわかりません。sessionヘルパーを呼び出したのであれば、@current_userとなる気がしてしまいます。もし、railsでは@を外すような操作が許されているとして、このような省略は一般的なのでしょうか?

ruby

1redirect_to(root_url) unless @user == current_user

#ソースコード

ruby

1/users_controller.rb 2 3 4def correct_user 5 @user = User.find(params[:id]) 6 redirect_to(root_url) unless @user == current_user 7end
/session_helper.rb def current_user if (user_id = session[:user_id]) @current_user ||= User.find_by(id: user_id) elsif (user_id = cookies.signed[:user_id]) user = User.find_by(id: user_id) if user && user.authenticated?(:remember, cookies[:remember_token]) log_in user @current_user = user end end

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

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

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

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

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

guest

回答1

0

まず第一に、current_userメソッドが呼び出されていると言う認識で良いのでしょうか?

はい、そのとおりです。

また、@current_userとなっておらず、current_userとなっていることもよくわかりません。

current_userでは、一度判定すれば結果を@current_userキャッシュしているだけの話です。以前にセットしていなければnilになってしまう@current_user経由より、呼び出せばきちんと値が取れるcurrent_userを呼ぶほうが良いコードかと思います。

もし、railsでは@を外すような操作が許されているとして、このような省略は一般的なのでしょうか?

current_user@current_userは別物ですが、このように「current_userの結果を@current_userにキャッシュさせる」ような構造はよくあります。

投稿2019/07/01 14:06

maisumakun

総合スコア145184

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

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

voodoochildtan

2019/07/01 17:33

回答ありがとうございます。何か引っ掛かりが取れたような気がしています。 sessionメソッド、あるいはcookiesメソッドから取り出された、user.idを持つuserが取り出され、それが最後に評価される式となる、つまり返り値になり、それが@user と等しいかが比較されていると解釈したのですが、大丈夫でしょうか?
voodoochildtan

2019/07/01 17:42

以下ようにコードを書いて確かめてみました。 def a 1 end puts 1 == a #=> true 返り値を上手く設定できれば、比較演算子によって比較される項にメソッドを用いることができることがわかりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問