2013-06-09 2 views
0

내 레일 응용 프로그램에 간단한 인증을 설정하려고합니다. security_users 발판을 가지고 있으며 일부 사용자를 만들었습니다.find_by_ * 메서드가 객체를 반환하지 않습니다.

이러한 계정 중 일부를 사용하여 로그인하려고 할 때 "find_by_ *"메서드가 현재 계정을 검색 할 수 없다는 것을 예고합니다.

이 내 세션 컨트롤러처럼 보이는 방법 (I 문제 디버깅하기 위해 목적에서 암호 체크 주석이)입니다 : 나는 세션을 만들려고 할 때

class SessionsController < ApplicationController 

    def new 
    end 

    def create 
    @security_user = SecurityUser.find_by_email(params[:email]) 
    if @security_user #&& @security_user.authenticate(params[:password]) 
     session[:security_user_id] = @security_user.id 
     redirect_to root_url, notice: "Logged in!" 
    else 
     flash.now.alert = "Email or password is invalid" 
     render 'new' 
    end 
    end 

    def destroy 
    session[:user_id] = nil 
    redirect_to root_url, notice: "Logged out!" 
    end 
end 
그래서

(로그인하기)을 세션 '새'템플릿으로 리디렉션됩니다. 모든 권리 될 것으로 보인다

enter image description here

이 디버그 정보입니다.

SecurityUser.find_by_email (PARAMS [: 이메일]) 다음 문은 기록을 찾을 수 없습니다 왜

편집 : 콘솔에서이 반환 위의 라인을 입력

기록 :

enter image description here

+0

오류가 발생 했습니까? – Rinku

+0

@Rinku 오류가 발생하지 않았습니다. 도우미 (find_by_email)가 사용자를 찾을 수 없으며 이로 인해 세션을 만들 수 없습니다. – gotqn

+0

hils는 레일 콘솔로 그것을 확인 했습니까? 그것을 얻을 수 있습니까? – Rinku

답변

1

우선,이 레일 인증, Y에서 간단한 운동을하지 않는 한 이 단계에서 Devise 또는 AuthLogic을 사용해야합니다.

둘째, params [: email]에 찾고있는 이메일이 포함되어 있습니까? params에서 params [: session] [: email]를 사용하는 것처럼 보입니다.

셋째,이 모델을 모델로 옮겨야합니다. 예를 들어 :

class SecurityUser < ActiveRecord::Base 
    def self.authenticate(params) 
    user = where(email: params[:email]).first 
    (user && user.password == params[:password]) ? user : false 
    end 
end 

그리고 컨트롤러 : 암호 해시되지 않도록 위의

@user = SecurityUser.authenticate params[:session] 
session[:user_id] = user.id if @user 

주 - 당신은 일반 텍스트 암호를 저장하지 않아야 -하지만이에 관한 게 아니에요.

이제 find_by 대신 where(). first를 사용해야합니다.

+0

예, [was session : [email] - 그것이 문제의 원인이었습니다. 나 자신을 만드는 방법을 실행하기 위해 Devise와 같은 준비된 솔루션을 사용하지 않습니다. 왜 "인증"방법을 사용하는 대신이 모델을 내 모델로 옮겨야합니까? 또한 암호는 일반 텍스트로 저장되지 않습니다. bcrypt를 사용하고 있습니다. – gotqn

관련 문제