2012-05-10 7 views
0

저는 Ruby on Rails를 처음 사용했습니다. 저는 Michel Hartl의 인터넷에서 사용할 수있는 참고서를 통해 그것을 배우고 있습니다. 그러나 사용자가 로그인하는 동안 문제가 발생하면 before_save가 create_remember_token 메서드를 호출하지 않는 것으로 의심됩니다. 나는 아주 오랜 시간이 문제를 디버깅하려고합니다.레일즈 remember_token 세션이 작동하지 않습니다.

user.rb 파일 : 다음과 같이 내 코드는

# == Schema Information 
# 
# Table name: users 
# 
# id    :integer(4)  not null, primary key 
# name   :string(255) 
# email   :string(255) 
# created_at  :datetime  not null 
# updated_at  :datetime  not null 
# password_digest :string(255) 
# username  :string(255) 
# remember_token :string(255) 
# 

class User < ActiveRecord::Base 
def to_param 
username 
end 
attr_accessible :name, :email, :password, :password_confirmation, :username 
has_secure_password 


before_save { |user| user.email = email.downcase } 
before_save :create_remember_token 

private 

def create_remember_token 
self.remember_token = SecureRandom.urlsafe_base64 
end 
end 

session_helper.rb을

module SessionsHelper 

def sign_in(user) 
cookies.permanent[:remember_token] = user.remember_token 
current_user = user 
end 

def current_user=(user) 
    @current_user = user 
end 

def current_user 
@current_user ||= user_from_remember_token 
end 

def signed_in? 
!current_user.nil? 
end 

private 

def user_from_remember_token 
    remember_token = cookies[:remember_token] 
    User.find_by_remember_token(remember_token) unless remember_token.nil? 
end 
end 

sessions_controller.rb :

class SessionsController < ApplicationController 
def new 

end 

def create 
    user=User.find_by_username(params[:session][:username]) 
    if user && user.authenticate(params[:session][:password]) 
     sign_in user 
     redirect_to "/@/#{params[:session][:username]}" 
    else 
     flash.now[:error] = "Login failed! Please try again!" 
     render 'new' 
    end 
end 

def destroy 

end 
end 

나에게 도움을 알려 주시기 바랍니다 문제가있는 곳을 가리킨다. 건배 :)

답변

0

1 년 전에이 질문을 게시했습니다. 이제 인증을 위해 Devise 보석을 사용하고 있습니다. 모든 것이 예상대로 작동합니다.

감사합니다.

1

before_save 콜백은 사용자 생성시 (즉, 로그인 할 때가 아니라 가입 할 때) 호출해야합니다. 코드 샘플에 전체 가입/사용자 생성 흐름을 표시하지 않지만 존재한다고 가정합니다.

당신은 레일 콘솔에서이 명령을 실행하여 create_remember_token가 (사용자가 생성 될 때) 호출되는지 여부를 테스트 할 수 있습니다

User._save_callbacks.select { |cb| cb.kind.eql?(:before) }.collect(&:filter).include?(:create_remember_token) 

만 create_remember_token 기능이 저장에서 실행되는 경우 경우에 true를 반환해야합니다 . Callbacks API Documentation의 '콜백 디버깅'섹션에서 자세히 알아보십시오.

등록 과정에서 콜백이 호출되면 remember_token을 DB에 저장해야합니다. Rails 콘솔 (User.last, 테스트 사용자 생성 후)을 사용하여 사용자를 검사하여이를 검증 할 수 있습니다.

가입 및 사용자 생성 과정은 어떻게됩니까? 당신이 묘사하고있는 문제를 일으키는 재현 단계는 무엇입니까?

+0

user_controller.RB : 클래스 UsersController <와 ApplicationController는 데프 새로운 데프 사용자 @ \t = User.find_by_username (PARAMS [: 이름]) 보여 사용자 = User.new 끝 @ \t 끝 데프 사용자 @ \t = 사용자를 만들 .new를 (PARAMS [: 사용자]) \t A =의 PARAMS [: 이름] \t 경우 @ \t \t 플래시 user.save [: 성공] = "! 오신 것을 환영합니다 SocialCrow 이메일 주소를 확인하시기 바랍니다" \t \t redirect_to "/ @/# {PARAMS [: 사용자] [: 사용자 이름]}"다른 \t 이 \t \t이 '새로운' \t 끝 끝 끝 – swaroopsm

+0

그래서 u는 내가이 토큰 동안을 생성 말을 의미 렌더링 가입 절차 – swaroopsm

+0

예. Create 함수의 'if @ user.save ...'호출은 create_remember_token을 포함하여 before_save 콜백을 트리거합니다. 귀하의 회신에 감사드립니다. –

1

로그인하는 동안 발생하는 문제는 무엇입니까?

내가 물어 보는 이유는 create_remember_token 메서드가 로그인 프로세스 중에 호출되지 않아야한다는 것입니다. 사용자가 저장 될 때 호출됩니다 (가입).

로그인 프로세스는 사용자 테이블에서 토큰을 가져 와서 영구 쿠키에 복사합니다. 로그인 절차는 대략 다음과 같습니다.

sign_in user -> session_helper.rb -> def sign_in (user) -> cookies.permanent [: remember_token] = user.remember_token -> session_controller로 돌아 가기 .rb -> redirect_to ...

+0

. 그것은 지금 lyk 매력을 움직이게한다!! :) – swaroopsm

0

레이아웃에 csrf 메타 태그를 사용하지 않았을 수 있습니다. 컨트롤러 폴더의 application_controller.rb에서 '위변조 방지'를 제거하십시오. 그런 다음 응용 프로그램을 다시 실행 해보십시오. 작동하는 경우 레이아웃에 태그를 추가하지 않았습니다.

관련 문제