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

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

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

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

Ruby on Rails 6

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

Q&A

解決済

2回答

4604閲覧

シンボルを踏まえたrubyの括弧⇨()と角括弧⇨[]の違いについて

moai891

総合スコア9

Ruby

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

Ruby on Rails 6

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

0グッド

0クリップ

投稿2020/07/16 14:14

シンボルを踏まえたrubyの括弧⇨()と角括弧⇨[]の違いについて

メソッドの意味、paramsの理解不足等々、様々なことへの理解が浅いかもしれないですが、
ご了承ください。

例えば、以下のコードを記入するとpassword情報をsessionに代入することが可能になります。

session["devise.regist_data"] = {user: @user.attributes} session["devise.regist_data"][:user]["password"] = params[:user][:password]

質問の本題となりますが、以下ご教授頂ければ幸いです。

  1. なぜsessionでは[] + 文字列で値を取得できるのか?
  2. なぜ["devise.regist_data"][:user]["password"]では[:user]のみシンボルなのか
  3. params[:user][:password]はなぜ両方ともシンボルなのか
  4. paramsはメソッドではああるが引数に()括弧をなぜ使用しないのか

恐れ入りますが、よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

4: (ソースは読んでいませんが挙動から見て)paramsはメソッドです。
実体は def params ; @params ; end かもしれませんが。
もし変数ですと、controllerのmethodのなかで定義なしには使えません。
sessionも定義なしで使えるので、これもメソッドでしょう。

rubyのメソッドは引数を囲む丸括弧は省略しても良いことになっています。
params()[:user] と書かずに params[:user]と書けるのはそのためです。

params[:user][:password]はなぜ両方ともシンボルなのか

paramsはHash(を返すメソッド)の様に見えますが、じつはHashではなく、HashWithIndifferentAccessというRAILSで拡張されたclassです。
このclassはほとんどHashなのですが、params[:name]でもparams["name"]でも同じものを指す様につくられています。ですから 'params["user"]["password"] と書いても同じデータがえられます。"user"ではなく:userを用いることが多いのはkey touch が少なくて済むから、と勝手に考えています。

なぜsessionでは[] + 文字列で値を取得できるのか?

これ質問の意味がわかりません 「なぜ session[文字列]で」という意味ですか?ですと Hash(を返すmethod)だから、です

投稿2020/07/17 08:12

winterboum

総合スコア23567

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

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

moai891

2020/07/17 13:55

丁寧にご回答ありがとうございます。疑問が解消されました。 > これ質問の意味がわかりません 「なぜ session[文字列]で」という意味ですか?ですと Hash(を返すmethod)だから、です ご返信頂いた通りなぜ session[文字列]で、という意味でした。教えて頂きありがとうございます。
guest

0

ベストアンサー

ご存知だと思いますが、RailsはRubyで作られています。
paramsもsessionもRails特有の機能であり、(Railsのソースコードを全て見ない限り)Rubyで全てを直接理解することはできないと思います。

ruby

1[1, 2].class #=> Array 2"hoge".class #=> String 3params.class #=> ActionController::Parameters 4session.class #=> ActionDispatch::Request::Session

params, session がメソッドだとして、返り値がRubyにはないクラスである点に注意です。

なぜsessionでは[] + 文字列で値を取得できるのか?

そう定義しているからです。
なお、Rubyでは、インスタンスメソッドでdef []=(key, val)という特殊なメソッドの定義の方法があります。
Rails の session を完全に理解した - Qiita
この記事を読んでもらえれば、sessionは、[]メソッドと[]=メソッドという特殊なメソッドを定義しているのが書かれています。

なぜ["devise.regist_data"][:user]["password"]では[:user]のみシンボルなのか

まず、基本的にparamsもsessionも、シンボルでも文字列でも同じものが取れるはようにRailsで作られています。しかし、シンボルに.(ピリオド)が使えないので、今回は:devise.regist_dataとは書けないです。
次に、{user: @user.attributes}はRubyからあるHashと呼ばれるものです。Hashは、keyの部分で文字列とシンボルを区別します。:userと"user"を区別するので、今回は:userしか書けません。

params[:user][:password]はなぜ両方ともシンボルなのか

paramsは、文字列とシンボルを区別しないので、"user"としても:userとしてもどちらでも取れるはずです。書いた人に聞かないとわからないですが、深い意味はないかと思います。シンボルの方がスッキリ書けて使っている人も多く、あえて文字列にする必要がなかっただけだと思います。

paramsはメソッドではああるが引数に()括弧をなぜ使用しないのか

sessionをメソッドだと説明しているところもあれば、特殊な変数と説明しているところもありますね。
ハッシュのような変数の振る舞いをするので、少なくともparamsやsessionをメソッドと説明するのは、初心者に対してとてもわかりにくいものだと思います。

投稿2020/07/16 23:22

編集2020/07/17 09:50
shisha

総合スコア86

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

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

moai891

2020/07/17 14:25

丁寧にご回答ありがとうございます。 rubyの枠で考えすぎて、Railsで作成されたものということに気づきませんでした。 シンボル、ハッシュの使い方も詳しく教えて頂きありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問