2013-02-11 109 views
1

我想让before_filter处理需要用户登录的操作,但是由于事实并非如此,所以一定是错误的。before_filter似乎没有“踢”

我使用名为'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

您是否使用任何验证宝石? – 2013-02-11 19:17:13

+0

我使用bcrypt-ruby,如果这算作一个认证宝石... – dracula 2013-02-11 19:20:23

回答

6

所以,before_filter是一个有点误导性的名字。它不是一个真正的过滤器。如果你返回一个错误的值,并不是它会过滤出其他的行为并阻止它们发生,如果你返回一个错误的值,它就会被允许。这是在别的之前调用方法的一种方法。把它看作'在调用路由触发的动作之前,调用以下方法'。

事实上,在Rails 4中,他们将before_filter重命名为before_action,这应该可以缓解前进的困惑。

你刚刚从signed_in返回T/F?所以它会检查并继续前进,因为您根据检查结果没有告诉它做任何特别的事情。

因此,而不是调用signed_in?像这样的东西会工作:

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

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

跳,这有助于。

+0

非常感谢您为我解决这个问题! – dracula 2013-02-11 20:03:51

+0

如果是的话,你可以随时接受答案! – 2013-02-11 22:31:42

1

我一直看到的before_filter引发异常或重定向到另一个页面时没有电流登录。我不确定返回false会阻止页面呈现。

+0

谢谢,你说得对。我需要使用一些重定向来使它工作。 :) – dracula 2013-02-11 19:30:30