我有一个控制器动作需要使用AJAX调用。所以我使用skip_before_filter
来关闭我为该特定呼叫登录的要求。
这有效,但在后续请求中,我被重定向到登录表单。我怎么能避免这个?
这是控制器中的过滤器代码:
protect_from_forgery
before_filter :logged_in?
skip_before_filter :logged_in?, :only => [:toggle_waiver]
以下是控制器操作:
def toggle_waiver
@household = Household.find(params[:household_id])
@household.update_attributes(:waive_latefee => params[:bool])
render :nothing => true
end
logged_in?
方法只是一个本土方法:
def self.authenticate(username, password)
user = find_by_username(username)
if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt)
user
else
nil
end
end
有更好的方法吗? (我使用Rails 3 ......不要评判我): - )
这里是logged_in?
控制器方法(来自application_controller
):
protected
def logged_in?
unless session[:admin_id]
flash[:notice] = "Please log in."
redirect_to log_in_path
return false
else
return true
end
end
session
由会话控制器中的此方法设置:
def create
admin = Admin.authenticate(params[:username], params[:password])
if admin
session[:admin_id] = admin.id
redirect_to root_url, :notice => "Logged in!"
else
flash.now.alert = "Invalid email or password"
render "new"
end
end
答案 0 :(得分:1)
使用before_filter的“except”子句可以使这更简单。
before_filter :logged_in, :except => [:toggle_waiver]
此外,“如果过滤器之前呈现或重定向,则操作将不会运行。如果计划在该过滤器之后运行其他过滤器,则它们也会被取消。”因此,抛弃过滤器的真/假方法,并使其成为渲染或重定向,以控制发生的事情。