2016-04-13 3 views
0

Здравствуйте, я боролся с этим из последних нескольких часов, но я не могу узнать, где не так.Невозможно получить значение из сеанса в рельсах 5

я устанавливаю session с user_id в SessionsController как этот

class SessionsController < ApplicationController 

skip_before_action :authenticate, except: [:logout] 

def new 
    @session = Session.new 
end 

def create 
@user_session = Session.new(session_params) 

if @user_session.valid? 
    session[:user_id] = @user_session.user_id 
    redirect_to learners_url 
else 
    redirect_to learner_new_registrations 
end 
end 

def logout 
    session[:user_id] = nil 
    redirect_to root_url 
end 

private 

def session_params 
    params.require(:session).permit(:email, :password) 
end 

конца

в create действия после установки значения сеанса он перенаправляет на learners_url, но опять-таки перенаправляет укоренить URL. соблюдать следующие server log

Started POST "/sessions" for 127.0.0.1 at 2016-04-13 12:00:01 +0530 
Processing by SessionsController#create as HTML 
    Parameters: {"session"=>{"email"=>"[email protected]", "password"=>"[FILTERED]"}, "login-submit"=>"Submit"} 
Can't verify CSRF token authenticity 
MONGODB | localhost:27017 | project_practice_development.find | STARTED | {"find"=>"users", "filter"=>{"email"=>"[email protected]"}, "limit"=>-1} 
MONGODB | localhost:27017 | project_practice_development.find | SUCCEEDED | 0.000360343s 
Redirected to http://localhost:3000/learners 
Completed 302 Found in 67ms 


Started GET "/learners" for 127.0.0.1 at 2016-04-13 12:00:01 +0530 
Processing by LearnersController#index as HTML 
MONGODB | localhost:27017 | project_practice_development.find | STARTED | {"find"=>"users", "filter"=>{"_id"=>nil}} 
MONGODB | localhost:27017 | project_practice_development.find | SUCCEEDED | 0.000387588s 
Redirected to http://localhost:3000/ 
Filter chain halted as :authenticate rendered or redirected 
Completed 302 Found in 2ms 


Started GET "/" for 127.0.0.1 at 2016-04-13 12:00:01 +0530 
Processing by WelcomesController#about as HTML 
    Rendered welcomes/about.html.erb within layouts/welcomes (0.2ms) 
Completed 200 OK in 16ms (Views: 15.4ms) 

Это означает, что он перенаправляет к LearnersController#Index действий. В ApplicationController я установил call back как этого

class ApplicationController < ActionController::Base 
    # Prevent CSRF attacks by raising an exception. 
    # For APIs, you may want to use :null_session instead. 
    protect_from_forgery 

    before_action :authenticate 

    def authenticate 
    return if signed_in? 
    redirect_to root_url 
    end 

    def current_user 
    @current_user ||= User.find(session[:user_id].to_s) #Problem is here. Here i am unable to access session[:user_id] which i was set in sessions controller. so it is redirecting to `root_url` 
    rescue Mongoid::Errors::DocumentNotFound => ex 
    end 

    def signed_in? 
    current_user.present? 
    end 

    helper_method :authenticate? 
end 

Помоги мне решить эту проблему. почему я не смог использовать значения session[:user_id] в контроллере приложения? Заранее спасибо. Примечание: Я использую рельсы 5.0.0.beta3 версия

ответ

0

Вы никогда не создали сеанс, попробуйте следующее:

def create 
#@user_session = Session.create(session_params) 
user = User.find_by(email: params[:session][:email].downcase) 
if user && user.authenticate(params[:session][:password]) 
    session[:user_id] = user.id 
    redirect_to learners_url 
else 
    redirect_to learner_new_registrations 
end 
end 

Поскольку вы не прошедшее проверку подлинности пользователя. Итак, в вашем ApplicationController у вас есть метод с именем authenticate. Сначала он проверяет, является ли пользователь signed_in? или нет. Если нет, то он перенаправляет вас на root_url.

def authenticate 
    return if signed_in? 
    redirect_to root_url 
end 
+0

Это то, что я сделал в 'SessionController # Create' Action. что такое различие? @dkp –

+0

В 'def current_user @current_user || = User.find (session [: user_id] .to_s) #puts session [: user_id] дает мне nil после того, как я прошел проверку подлинности. спасение Mongoid :: Errors :: DocumentNotFound => ex end' –

+0

'session [: user_id] = @ user_session.user_id' - у вас есть это утверждение в вашем действии на создание. Вы должны получать пользователя от БД, например '@user = User.find_by_email (params []): email'. Затем вы можете аутентифицировать пользователя и задавать сеанс как 'session [: user_id] = @ user.id' – dp7

Смежные вопросы