0

我已经完成了 Michael Hartl 的 Ruby on Rails 教程,并且还实现了一个包含在我的应用程序导航栏上的小型登录表单(因此用户可以从实际登录页面或导航栏登录)。如果用户从登录页面登录,我确实希望他们重定向到 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,但它似乎将会话路径捕获为 session[:return_to] 值,而不是登录请求的原始页面。我会很感激你的想法。

4

1 回答 1

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
  • 从站点导航栏中的登录表单登录,它会重定向回原始页面(除非原始页面是主登录表单)
  • 这对每个使用相同的会话控制器创建方法

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

于 2012-12-14T07:44:59.537 回答