RailsTutorial.org第9章session.delete问题

时间:2012-09-20 17:14:19

标签: ruby-on-rails ruby session authentication railstutorial.org

我正在关注http://ruby.railstutorial.org

上的教程

具体而言,第9章(9.2.3) http://ruby.railstutorial.org/chapters/updating-showing-and-deleting-users#top

当访问受限制的页面时会提示用户登录,然后在成功登录后重定向回受限制的页面,我成功获得了该部分。

我正在努力获取它,以便在重定向到受保护的页面后,下次登录尝试将直接返回到主用户个人资料页面,但是,session.delete(:return_to)似乎无法正常工作用户被反复定向回最初保存的受保护页面。这是我的代码:

我的会话控制器:

class SessionsController < ApplicationController

  def new

  end

  def create
    user = User.find_by_email(params[:session][:email])
    if user && user.authenticate(params[:session][:password])
      sign_in user
      redirect_back_or user
      # Sign the user in and redirect to the user's show page.
    else
      # Create an error message and re-render the signin form.
      flash.now[:error] = 'Invalid email/password combination'
      render 'new'
    end
  end

  ...

end

我的会话助手:

module SessionsHelper

  def sign_in(user)
    cookies.permanent[:remember_token] = user.remember_token
    self.current_user = user
  end

  def signed_in?
    !current_user.nil?
  end

  def current_user=(user)
    @current_user = user
  end

  def current_user
    @current_user ||= User.find_by_remember_token(cookies[:remember_token])
  end

  def current_user?(user)
    user == current_user
  end

  def sign_out
    self.current_user = nil
    cookies.delete(:remember_token)
  end

  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
end

你能给予的任何帮助都会非常棒!似乎session.delete()根本无效。

2 个答案:

答案 0 :(得分:1)

当我完成本教程时,我的代码只有SessionsController#create方法的第一行:

user = User.find_by_email(params[:email])
if user && user.authenticate(params[:password])

但是,我可以看到the corresponding code in the book已更改为:

user = User.find_by_email(params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])

我试图在我的sample_app中使用这个新代码,但我的大部分测试都失败了。因此,对于您,我猜测试首先将downcase方法添加到您的params[:session][:email]调用中,如果这不起作用,请尝试将这些行替换为session - 上面的代码更少并看看它是否有效。

更新

在查看您的代码后,据我所知,这些是您的问题:

您出于某种原因在session.delete(:return_to)中呼叫SessionsController#create。此行可以删除:

应用/控制器/ sessions_controller.rb

def create
  user = User.find_by_email(params[:session][:email].downcase)
  if user && user.authenticate(params[:session][:password])
    # session.delete(:return_to)
    sign_in user
    # ...
  #...
end

UsersController#signed_in_user方法中的两行代码都需要放在unless块中,而不只是调用redirect_to

应用/控制器/ users_controller.rb

def signed_in_user
  unless signed_in?
    store_location
    redirect_to signin_url, notice: "Please sign in." #unless signed_in?
  end
end

如果您进行了这些更改并运行测试,那么您的通话中仍会有Nokogiri::XML::XPath::SyntaxError:

<强>规格/请求/ authentication_pages_spec.rb

it { should have_exact_title('title', text: full_title('')) }` 

但我假设这是一个你计划进行的自定义匹配器。如果没有,这是一个错误,删除它,你的所有测试都将通过。

答案 1 :(得分:1)

以下街区解决了这个问题。没有什么需要改变。

def signed_in_user
  unless signed_in?
    store_location
    redirect_to signin_url, notice: "Please sign in." #unless signed_in?
  end
end