before_filter似乎没有“踢”
我想让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
所以,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
跳,这有助于。
非常感谢您为我解决这个问题! – dracula 2013-02-11 20:03:51
如果是的话,你可以随时接受答案! – 2013-02-11 22:31:42
我一直看到的before_filter引发异常或重定向到另一个页面时没有电流登录。我不确定返回false会阻止页面呈现。
谢谢,你说得对。我需要使用一些重定向来使它工作。 :) – dracula 2013-02-11 19:30:30
您是否使用任何验证宝石? – 2013-02-11 19:17:13
我使用bcrypt-ruby,如果这算作一个认证宝石... – dracula 2013-02-11 19:20:23