首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RailsTutorial.org Chapter9 session.delete问题

RailsTutorial.org Chapter9 session.delete问题
EN

Stack Overflow用户
提问于 2012-09-21 01:14:19
回答 2查看 949关注 0票数 2

我正在学习http://ruby.railstutorial.org上的教程

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

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

我正在尝试获取它,以便在重定向到受保护的页面后,下一次登录尝试将直接返回到主用户配置文件页面,但是,session.delete(:return_to)似乎不起作用,用户被重复地定向回最初保存的受保护的页面。下面是我的代码:

我的会话控制器:

代码语言:javascript
复制
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

我的会话助手:

代码语言:javascript
复制
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()根本不能工作。

EN

回答 2

Stack Overflow用户

发布于 2012-09-21 08:36:54

当我学习本教程时,我的代码具有SessionsController#create方法的第一行,如下所示:

代码语言:javascript
复制
user = User.find_by_email(params[:email])
if user && user.authenticate(params[:password])

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

代码语言:javascript
复制
user = User.find_by_email(params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])

我试图在我的sample_app中使用新的代码,但我的大多数测试都以失败告终。因此,对于您来说,我想首先测试一下将downcase方法添加到您的params[:session][:email]调用中,如果这样做不起作用,请尝试用下面的代码替换上面的session-less代码,看看它是否起作用。

更新

看过你的代码后,据我所知,以下是你的问题:

由于某种原因,您在SessionsController#create中调用session.delete(:return_to)。可以删除此行:

app/controllers/sessions_controller.rb

代码语言:javascript
复制
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的调用

app/controllers/users_controller.rb

代码语言:javascript
复制
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:来调用

spec/requests/authentication_pages_spec.rb

代码语言:javascript
复制
it { should have_exact_title('title', text: full_title('')) }` 

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

票数 1
EN

Stack Overflow用户

发布于 2013-10-30 15:36:31

下面的代码块解决了这个问题。其他的都不需要改变。

代码语言:javascript
复制
def signed_in_user
  unless signed_in?
    store_location
    redirect_to signin_url, notice: "Please sign in." #unless signed_in?
  end
end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12517561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档