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

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

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

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

Ruby on Rails 4

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

Q&A

解決済

1回答

3075閲覧

【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/16 12:13

###前提・実現したいこと
練習として、簡単なSNSアプリケーションを作成しています。
session[:login].idを書くとエラーが出ない場所と出る場所があります。

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

NoMethodError in MembersController#show undefined method `id' for #<Hash:0x9a9bdc8> Rails.root: C:/Users/ide/Desktop/play/RoR_plan/miniSNS2 Application Trace | Framework Trace | Full Trace app/controllers/members_controller.rb:7:in `show'

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

class MembersController < ApplicationController def show ###CHECK_2 puts session[:login].id #=> ERROR if !checklogin? then return end @me = me? @member = Member.find(params[:id]) frs =Friend.where(:member_id => params[:id].to_i) frlist = '(' frs.each do |fr| frlist += fr.friend_id.to_s + "," end frlist += '0)' query = "select * from members where id in " + frlist @friends = Member.find_by_sql(query) frs =Friend.where(:friend_id => params[:id].to_i) frlist = '(' frs.each do |fr| frlist += fr.member_id.to_s + "," end frlist += '0)' query = "select * from members where id in " + frlist @friended = Member.find_by_sql(query) @isFr = Friend.where(:member_id => session[:login].id, :friend_id => params[:id].to_i).count > 0 @isFded = Friend.where(:friend_id => session[:login].id, :member_id => params[:id].to_i).count > 0 respond_to do |format| format.html # show.html.erb format.json { render json: @member } end end # login def login params.permit! @msg = "get" @member = Member.new if request.post? then @member = Member.new(params[:member]) record = Member.find_by_user(params[:member][:user]) if record == nil then @msg = "record is nil." @member.errors.add('user',"not registrated!") else if record.pass != params[:member][:pass] then @msg = "password is worng." @member.errors.add('pass','password is wrong!') else @msg = "good!" @member = record session[:login] = record ###CHECK_1 puts session[:login].id #=> NO ERROR redirect_to '/members/' + record.id.to_s end end end end end

###試したこと
SNSのログイン機能を作っています。

ユーザー名とパスワードを入力し、submitボタンを押すと上のコードのloginアクションが呼び出され、その後、showアクションが実行されます。
loginアクションの「###CHECK_1」で示している場所で、session[:login].idを確認するとちゃんとidが取得できるのですが、showアクションの「###CHECK_2」で示している場所では上記したエラーが発生してしまいます。

ちなみに、puts session[:login]とすれば、どちらの場所でも

{"id"=>1, "user"=>"sayama", "pass"=>"XXX", "name"=>"sayama kitahiro", "mail"=>"sayama_kitahiro@gmail.com", "admin"=>true, "created_at"=>"2016-08-15…

と表示されて、正常なように思えます。

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

ActiveRecordオブジェクトをそのままsessionに渡しているようですが、ActiveRecordでDBとマッピングされたカラムメソッドがリクエストを越えて保持しているかはこの現象を聞く限りでは怪しいですね。。

セッションの値はcookieを利用して渡されますし、今の状態だとクライアントにパスワードなどの情報を渡してしまうことになっていますので、セキュリティの面で危険な状態です。なので、この現象を解析して対応するよりは、sessionにはidのみを渡すのが無難かと思います。以下が案です:

ruby

1# login 2session[:login_id] = record.id 3 4# show 5puts session[:login_id] 6@member = Member.find_by_id session[:login_id] 7return if @member.blank? 8...

少し資料を漁ってみました。この周辺だと下記リンクが比較的分かり易そうだったので紹介します:
Rails4での基本的なセッションの使い方 - Rails Webook

投稿2016/08/16 15:30

編集2016/08/16 15:35
toshi3221

総合スコア34

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

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

sayama

2016/08/16 21:48

回答ありがとうございます。 この現象は以下のようにすることで解決したのですが、 session[:login].id => session[:login]["id"] このやり方だとセキュリティ上良くないのですね。 toshi3221さんの言うようにidのみを渡す方法に改良したいと思います。 大変参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問