1

Я пытаюсь получить before_filter для работы над действиями, требующими входа пользователя в систему, однако что-то должно быть неправильно, потому что это не так.before_filter не кажется «kick in»

Я использую вспомогательный файл с именем session_helper.rb для входа в систему и выхода из системы, а также для проверки входа пользователя (signed_in?). Это работает отлично, если используется внутри действия или в представлении, однако при использовании его с before_filer он не работает. Если я выйду из системы и попытаюсь получить доступ к «/ projects/new», это возможно, хотя этого не должно быть.

Что я делаю неправильно?

контроллер проекта:

class ProjectsController < ApplicationController 
    before_filter :signed_in?, :except => [:index] // <-- doesn't prevent e.g. the action "new" to be executed 

    def new 
    @project = Project.new 
    @users = (current_user.blank? ? User.all : User.find(:all, :conditions => ["id != ?", current_user.id])) 
    end 

    def index 
    @projects = Project.all 

    if signed_in? // <-- works as it should 
     @users_projects = Project.where(:user_id => current_user.id) 
    end 
    end 

    ... other actions ... 

end 

sessions_helper.rb

module SessionsHelper 

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

    def signed_in? 
    !current_user.nil? 
    end 

    def current_user=(user) 
    @current_user = user 
    end 

    def current_user 
    @current_user ||= User.find_by_remember_token(cookies[:remember_token]) 
    end 

    def sign_out 
    self.current_user = nil 
    cookies.delete(:remember_token) 
    end 
end 
+0

Вы используете аутентификационный камень? –

+0

Я использую bcrypt-ruby, если это считается подлинным gem ... – dracula

ответ

6

Таким образом, before_filter является слегка вводящим в заблуждение именем. Это не фильтр. Дело не в том, что оно отфильтровывает другие действия и предотвращает их возникновение, если вы вернете значение ложности и разрешите им, если вы вернете правдивый. Это действительно способ вызова метода прежде всего. Подумайте об этом как «перед вызовом действия, которое вызвал маршрут, вызовите следующий метод».

Действительно, в Rails 4 они переименовывают before_filter в before_action, что должно облегчить перемешание.

Вы только что вернули T/F из signed_in? Поэтому он проверяет это и движется дальше, так как вы не сказали ему делать что-либо особенное, основанное на результатах этой проверки.

Так что вместо вызова signed_in? Что-то вроде этого будет работать:

before_filter :authorize, :except => [:index] 

def authorize 
    redirect_to login_url, alert: "Not authorized" if !signed_in? 
end 

Hop, который помогает.

+0

Большое спасибо за освобождение этого для меня! – dracula

+0

Вы всегда можете принять ответ, если он прав! –

1

Я всегда видел before_filter возбудит исключение или перенаправление на другую страницу, когда нет тока Логин. Я не уверен, что возвращение false предотвратит рендеринг страницы.

+0

Спасибо, ты прав. Мне нужно было использовать некоторое перенаправление, чтобы заставить его работать. :) – dracula