我已经通过Michael Hartl的Ruby on Rails Tutorial工作,并且还实现了我的应用程序导航栏中包含的小型登录表单(因此用户可以从实际登录页面或从导航栏登录)。如果用户从登录页面登录,我确实希望将它们重定向到root_url。
但是,如果用户从导航栏表单登录,我希望他们使用"成功登录来保持在同一页面上!"页面顶部的消息。我怎么能这样做?
我的代码如下:
来自_header.html.erb
文件:
<%= form_tag sessions_path, class: "navbar-form pull-right" do %>
<%= text_field_tag :email, nil, class: "input-small", placeholder: "Email" %>
<%= password_field_tag :password, nil, class: "input-small", placeholder: "Password" %>
<%= check_box_tag :remember_me, 1, params[:remember_me], title: "select to remember login" %>
<%= submit_tag "Sign in", class: "btn btn-mini" %>
<% end %>
来自sessions_helper.rb
文件:
def redirect_back_or(default)
redirect_to(session[:return_to] || default)
session.delete(:return_to)
end
def store_location
session[:return_to] = request.url
end
我试图利用redirect_back_or
中的sessions_helper.rb
方法,但似乎是将会话路径捕获为会话[:return_to]值,而不是登录请求的原始页面。我很感激你的想法。
答案 0 :(得分:0)
我终于弄清楚了......
在我的sessions_helper.rb
文件(已包含在ApplicationController
中)中,我添加了以下代码:
def store_location_login
session[:referral_url] = request.referer
end
def redirect_back_login_or(default)
if URI(signin_path).path == URI(session[:referral_url]).path
redirect_to root_url
else
redirect_to(session[:referral_url] || default)
end
session.delete(:referral_url)
然后我将SessionsController
创建操作更改为:
def create
user = User.find_by_email(params[:email].downcase)
store_location_login
if user && user.authenticate(params[:password])
if params[:remember_me]
sign_in user
else
sign_in_temp user
end
flash[:success] = "Successfully logged in!"
redirect_back_login_or root_url
else
flash.now[:error] = 'Invalid email/password combination'
render 'new'
end
end
这些更改会产生所需的行为:
我猜这可以重构一些,但它确实有效。