2014-03-17 2 views
0

Я пишу приложение Rails, у которого есть root_path для входа в систему и путь к профилю, к которому пользователи должны быть перенаправлены после входа в систему или если они уже вошли в систему и посещают домашнюю страницу. Я также хочу, чтобы пользователи, которые не вошли в систему, всегда были перенаправлены на страницу входа в систему, поэтому я настроил файл before_filter, чтобы попытаться сделать это. К сожалению, он ничего не понимает. Может ли кто-нибудь объяснить, что я делаю неправильно?Rails before_filter не перенаправляет

Контроллер Применение

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_filter :require_login 

    private 
    def current_user 
     @current_user ||= User.find(session[:user_id]) if session[:user_id] 
    end 

    def require_login 
     unless current_user 
     redirect_to root_url 
     end 
    end 

    helper_method :current_user, :require_login 
end 

Сессии контроллера

class SessionsController < ApplicationController 
    skip_before_filter :require_login 

    def index 
    if current_user 
     redirect_to profile_path 
    end 
    end 

    def create 
    user = User.from_omniauth(env["omniauth.auth"]) 
    puts(env["omniauth.auth"]) 
    session[:user_id] = user.id 
    redirect_to profile_path 
    end 

    def show 
    end 

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

Маршруты

Fbapp::Application.routes.draw do 
    root to: "sessions#index" 

    match 'profile', to: 'sessions#show', as: 'profile', via: [:get, :post] 
    match "auth/:provider/callback", to: "sessions#create", via: [:get, :post] 
    match "auth/failure", to: redirect('/'), via: [:get, :post] 
    match 'signout', to: 'sessions#destroy', as: 'signout', via: [:get, :post] 
    resources :posts 

ответ

2

Удалить

skip_before_filter :require_login 

из SessionsController

В настоящее время для всех действий в SessionsController skip_before_filter удаляет require_login фильтр из перед фильтром цепи. Следовательно, он никогда не называется.

BTW, вы можете управлять действиями, чтобы пропускать фильтр с помощью параметров: only и: except, как при применении фильтров.

skip_before_filter : require_login, :only => [:method_name]

или

skip_before_filter : require_login, :except => [:method_name]

+1

Я добавил skip_before_filter: require_login, только: [: индекс: создать] на мой контроллер сессий и что, казалось, сделать трюк! –

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