2

我正在关注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()根本行不通。

4

2 回答 2

1

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

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

但是,我可以看到书中对应的代码已经改为:

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

我试图在我sample_app的 . 所以,对你来说,我想首先测试将downcase方法添加到你的params[:session][:email]调用中,如果这不起作用,请尝试将这些行替换为session上面的 -less 代码,看看它是否有效。

更新

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

你打电话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('')) }` 

但我假设这是您计划使用的自定义匹配器。如果不是并且这是一个错误,请将其删除,您的所有测试都会通过。

于 2012-09-21T00:36:53.587 回答
1

以下块解决了它。没有其他东西需要改变。

def signed_in_user
  unless signed_in?
    store_location
    redirect_to signin_url, notice: "Please sign in." #unless signed_in?
  end
end
于 2013-10-30T07:36:30.513 回答