Rails:小问题<%if signed_in? %GT;

时间:2014-04-10 19:08:39

标签: ruby-on-rails ruby

目前在<%if signed_in时遇到问题? %GT;

当用户登录时,令牌已创建没有任何html更改时:

HTML

<% if signed_in? %> 
<li><%= link_to "Post", "signup", :class=> "post main-button-color"  %></li> 
<li><%= link_to "Settings", "signup", :class=> "settings main-button"  %></li> 
<li><%= link_to "Sign Out", "signout", :class=> "signout main-button"  %></li> 
<% else %> 
<li><%= link_to "Sign Up", "signup", :class=> "signup main-button"  %></li>
<li><%= link_to "Sign In", "signin", :class=> "signin main-button" %></li> 
<% end %>

修改

SessionsHelper

def sign_in(user)
  remember_token = User.new_remember_token
  cookies[:remember_token] = {:value => remember_token, :expires => 8.hours.from_now} #or whenever
  user.update_attribute(:remember_token, User.hash(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
  remember_token = User.hash(cookies[:remember_token])
  @current_user ||= User.find_by_remember_token(cookies[:remember_token])
end

def sign_out
  self.current_user = nil
  cookies[:remember_token] = nil
end

的ApplicationController

protect_from_forgery with: :exception
include SessionsHelper

用户模型

before_save :create_remember_token

def User.new_remember_token
  SecureRandom.urlsafe_base64
end

def User.hash(token)
  Digest::SHA1.hexdigest(token.to_s)
end

private

def create_remember_token
  self.remember_token = SecureRandom.urlsafe_base64
end

登录时一切仍然有效,记忆令牌保存在浏览器cookie中,但HTML仍无法正常工作。任何帮助,将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:1)

你正在做的事情与this类似,试着深入解释。

看起来您的signed_in?方法是正确的。不过,您在sign_in(user)方法中看起来并不像使用Cookie或令牌做任何事情。

如链接中所述,当用户登录时,您需要:

  • 使用会话令牌更新浏览器Cookie
  • 加密该会话令牌并将其存储在数据库中
  • 将当前已登录的用户设置为刚刚登录的用户

您的current_user方法会检查是否有与该会话关联的活动用户。如果有,则返回。如果没有,它将获取浏览器的会话令牌,对其进行加密,并检查是否有任何用户在数据库中具有该当前会话令牌。如果是,则返回该用户。如果没有,没有。此值是signed_in?正在检查的值。由于未正确设置,current_user将返回nil,并且页面的行为就像用户未登录一样。

def sign_in(user)

    # Create a token
    auth_token = SecureRandom.urlsafe_base64

    # Store the token in the browser
    cookies.permanent[:auth_token] = auth_token

    # Encrypt the token, store in database
    user.update_attribute(:auth_token, Digest::SHA1.hexdigest(auth_token))

    # Set current session's user
    self.current_user = user 
end

答案 1 :(得分:0)

我假设您已经按照rails教程...因此,当您登录用户时,您应该分配一个cookie值,以便获取并检查是否有用户符合该cookie。

在该术语中,您应该像这样更改sign_in方法:

def sign_in(user)
    remember_token = User.new_remember_token
    cookies[:remember_token] = {:value => remember_token, :expires => 8.hours.from_now} #or whenever
    user.update_attribute(:remember_token, User.encrypt(remember_token))
    self.current_user = user
end

您正在使用current_user方法请求cookie,并根据数据库检查它,但您没有分配任何内容...