我正在尝试重定向到我点击登录的页面,但在登录后不会重新更新到上一页但保留在登录页面上(尽管用户已经登录)。 这是我的代码:
session_helper.rb
module SessionsHelper
def sign_in(user)
remember_token = User.new_remember_token
cookies.permanent[:remember_token] = remember_token
user.update_attribute(:remember_token, User.encrypt(remember_token))
self.current_user = user
end
def redirect_back_or(default)
redirect_to(session[:return_to] || default)
session.delete(:return_to)
end
def store_location
session[:return_to] = request.fullpath
end
end
sessions_controller.rb
class SessionsController < ApplicationController
include SessionsHelper
def new
end
def create
user = User.find_by_username(params[:session][:username])
if user && user.authenticate(params[:session][:password])
cookies.permanent[:remember_token] = user.remember_token
#redirect_to root_url,:notice => "Logged in!"
redirect_back_or user
else
flash[:error] = 'Invalid email/password combination' # Not quite right!
render 'new'
end
end
def destroy
cookies.delete(:remember_token)
#session[:user_id] = nil
redirect_to root_url, :notice => "Logged out!"
end
end
我还尝试在sessions_controller.rb
中编写create functionredirect_to request.referer
但它不起作用。
我错过了什么吗?
感谢您的帮助!
答案 0 :(得分:0)
问题发生在store_location
。
虽然你没有说过,但我猜你可能会把这个方法放在before_filter
中。因此,无论是GET还是POST或其他请求,请求都会首先点击此过滤器并存储位置。
现在,在这种情况下,实际上用户有两个请求。一个是GET的#new
,另一个是POST的#create
。在后来,他对#new
的最后一次请求被记录为返回位置。所以你会看到你总是回到#new
:)
解决方案是过滤要存储的位置。
def store_location
disable_pattern = /\A\/user*/
session[:return_to] = request.fullpath unless request.fullpath ~= disable_pattern
end
这种模式可以解决当前的问题但不是排他性的。在实践中,您甚至可能会看到记录了JS / JSON请求,因此您可能需要根据具体情况添加更多限制。例如,仅对#show或#index应用before_filter
,使用白名单等
答案 1 :(得分:0)
我认为<select ng-model="ngModel" ng-change="ngChange({someModel: ngModel})"
ng-options="option.name for option in options">
</select>
可能因为方法中的拼写错误而无效。它应该是request.referer
。