정수

2012-02-11 4 views
0

나는 레일에서 간단한 로그인 시스템을 구현하기 위해 노력하고있어,하지만 난의 사용자 이름을 표시하려고 할 때 로그인 한 사용자, 내가이 오류 받으 기호를 변환 할 수 없습니다정수

can't convert Symbol into Integer 
Extracted source (around line #60): 

57:  </ul> 
58:  <% if session[:logged_in] %> 
59:   <% user = session[:user] %> 
60:   <p class="pull-right">Howdy, <strong><%= user[:username] %></strong>!</p> 
61:  <% end %> 
62:  </div> 
63: </div> 

내 모델 코드를 여기에 있습니다 : [: 사용자] :

require 'digest' 

class User < ActiveRecord::Base 

before_save {|user| user.password = Digest::SHA1.hexdigest(user.password)} 
attr_accessible :username, :password, :email 
validates_length_of :username, :password, :minimum => 7 
validates_presence_of :username,:password,:email, :on => :create 
validates_format_of :email, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i 

end 

이것은 내가 세션 설정하는 방법입니다

def create 
    if User.find(:all, :conditions => {:username => params[:username], :password => Digest::SHA1.hexdigest(params[:username])}) 
     user = User.find(:all, :conditions => {:username => params[:username], :password => Digest::SHA1.hexdigest(params[:password])}) 
     session[:user] = user 
     session[:logged_in] = true 
     redirect_to(:root, :notice => "Thanks for logging in!") 
    else 
     redirect_to(:new, :notice => "You supplied an invalid username/password combination.") 
    end 
end 
+0

[: 사용자] '을? 그리고 코드의 실패 지점에서'session [: user]'값은 무엇입니까? –

답변

5

아마 session[:user]입니다하지 않는이 있음 h, 당신이 기대하는대로, 그러나 배열. 따라서 정수 이외의 것으로 첨자 화하는 것은 유효하지 않습니다.

해결 방법? 실제로 세션 변수를 설정하는 코드 (예 : session[:user] = XYZ)를 변경하십시오.

편집 : 나는 가정, 당신은 session[:user]에 배열을 할당 할 수 있도록User.find(:all, ...)는, 배열을 반환합니다. 발견 된 첫 번째 사용자 만 할당해야합니다 (사실 기준에 일치하는 사용자 만 있어야합니다). 더 나은, 당신은 단지 세션에서 사용자 이름을 저장하고 필요한 경우 데이터베이스에서 가져올해야합니다

보기와 관련된 행동 그리고
def create 
    user = User.where(:username => params[:username], :password => Digest::SHA1.hexdigest(params[:username])).first 
    if user 
    session[:user_id] = user.id 
    else 
    redirect_to(:new, :notice => "You supplied an invalid username/password combination.") 
    end 
end 

: 뷰에서 다음

def ... 
    @user = User.find(session[:user_id]) 
    unless @user 
    # redirect to error page, user was deleted in the meantime 
    end 
end 

:

<%= @user.username %> 
1

전체 사용자 개체를 세션에 덤핑하는 것은 좋지 않은 생각이며 예상 한 결과를 얻지 못하는 것일 수 있습니다. 사용자 클래스에 #to_session과 같은 것을 구현해야합니다.이 클래스는 최소한의 필수 정보가있는 해시를 반환합니다. 같은 뭔가 : 다음

def to_session 
    {:id => id, :username => username, :email => email} 
end 

세션을 설정합니다

같은 코드 모습`세션 설정 않는 방법
session[:user] = user.to_session