从导航栏登录,并保持当前页面

时间:2012-12-13 23:32:48

标签: ruby-on-rails ruby-on-rails-3

我已经通过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]值,而不是登录请求的原始页面。我很感激你的想法。

1 个答案:

答案 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

这些更改会产生所需的行为:

  • 从主登录页面登录,成功登录后将用户重定向到root_url
  • 从站点导航栏中的登录表单登录,它会重定向回原始页面(除非原始页面是主登录表单)
  • 这为每个
  • 使用相同的会话控制器创建方法

我猜这可以重构一些,但它确实有效。