dra*_*ula 1 session confirm ruby-on-rails before-filter ruby-on-rails-3
我正在尝试让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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
所以,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
Run Code Online (Sandbox Code Playgroud)
跳帮助.
| 归档时间: |
|
| 查看次数: |
2301 次 |
| 最近记录: |