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

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

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

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

2回答

1329閲覧

rails 4:session[:login].idでundefined method `id'とエラーが出ます。

sayama

総合スコア28

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2016/08/15 14:43

###前提・実現したいこと
Rrail4で練習としてSNSアプリケーションを作っています。
勉強始めて数週間の初心者です。

###発生している問題・エラーメッセージ
以下のようなエラーがでます。

undefined method `id' for #<Hash:0x7ff1dc0> Rails.root: C:/Users/ide/Desktop/play/RoR_plan/miniSNS Application Trace | Framework Trace | Full Trace app/controllers/application_controller.rb:25:in `me?' app/controllers/members_controller.rb:21:in `show'

###該当のソースコード

Ruby

1【application_controller.rb】 2 def me? obj = nil 3 id_num = obj != nil ? obj.member_id : params[:id].to_i 4 if session[:login].id == id_num then 5 return true 6 else 7 return false 8 end 9 end 10 11【members_controller.rb】 12 def show 13 if !checklogin? then return end 14 @me = me? 15 @member = Member.find(params[:id]) 16以下省略

###試したこと
members_controller.rbの@me = me?の前で「puts session[:login].id」としたらこの場所でエラーが出ました。
同様に、application_controller.rbのif session[:login].id == id_num thenの前でやってもエラーです。
ただし、「puts session[:login]」とidを取れば、エラーが出ません。

members_controller.rbの別のメソッド内で「puts session[:login].id」とすれば、正常に表示されるのですがなぜでしょうか?

よろしくお願いします。

###補足情報(言語/FW/ツール等のバージョンなど)
Windows 7
Ruby 2.1.9p490
Rails 4.2.1

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

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

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

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

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

guest

回答2

0

ベストアンサー

session[:login]の中身がハッシュなら、アクセスするには

session[:login][:id]

とかでアクセスするのが正しいのではないでしょうか。

投稿2016/08/16 13:15

realizerS

総合スコア265

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

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

sayama

2016/08/16 13:44

ご回答ありがとうございます。  session[:login][:id] ではうまくいかなかったのですが、  session[:login]["id"] でうまくいきました。 しかし、アクションによっては  session[:login].id でも正常にidを取得できる場合もあるのです。 疑問は残りましたが、解決しましたので感謝いたします。 ありがとうございました。
guest

0

「puts session[:login]」とidを取れば

とありますが

別のメソッド内で「puts session[:login].id」とすれば、

ともあります。
タイプミスでないなら、session[:login] に何を入れているのかが気になります。

puts session[:login]でidが取れるのであれば

def me? 内で

if session[:login] == id_num then

とした場合は期待する結果になりますか?

投稿2016/08/15 16:29

flied_onion

総合スコア2604

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

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

sayama

2016/08/16 00:14

誤解を招いて申し訳ございません。  >ただし、「puts session[:login]」とidを取れば、エラーが出ません。 とはidが取得できるのではなく、idを除けばというつもりでした。 puts session[:login] とすると、 {"id"=>1, "user"=>"sayama", "pass"=>"XXX", "name"=>"sayama kitahiro", "mail"=>"sayama_kitahiro@gmail.com", "admin"=>true, "created_at"=>"2016-08-15… と表示されます。 以上、よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問