首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails:<% if signed_in?%>的小问题

Rails:<% if signed_in?%>的小问题
EN

Stack Overflow用户
提问于 2014-04-10 19:08:39
回答 2查看 95关注 0票数 0

当前,<% if signed_in?%>存在问题。

当用户登录时,令牌将被创建为,但在以下情况下,没有一个更改

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

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

代码语言:javascript
复制
protect_from_forgery with: :exception
include SessionsHelper

用户模型

代码语言:javascript
复制
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仍然不能工作。任何帮助都将不胜感激。谢谢。

EN

回答 2

Stack Overflow用户

发布于 2014-04-10 19:34:48

您所做的事情看起来类似于,试着四处寻找一个深入的解释。

看起来您的signed_in?方法是正确的。不过,在您的sign_in(user)方法中,您并没有对cookie或令牌做任何事情。

正如链接中所解释的,当用户登录时,您需要:

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

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

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

Stack Overflow用户

发布于 2014-04-10 19:32:57

我想你已经遵守了rails教程..。因此,当您在用户中签名时,您应该分配一个cookie值,以便根据该cookie获取并检查是否有用户。

在这种情况下,您应该更改您的sign_in方法如下:

代码语言:javascript
复制
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,并根据db检查它,但是您没有任何分配给它的.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22996914

复制
相关文章

相似问题

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