目前在<%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仍无法正常工作。任何帮助,将不胜感激。谢谢。
答案 0 :(得分:1)
你正在做的事情与this类似,试着深入解释。
看起来您的signed_in?
方法是正确的。不过,您在sign_in(user)
方法中看起来并不像使用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,并根据数据库检查它,但您没有分配任何内容...