为什么我不能通过其身份验证令牌找到ActiveRecord实例?

时间:2013-11-19 20:26:12

标签: activerecord ruby-on-rails-4

def current_user
  @current_user ||= User.find_by_auth_token!(cookies[:auth_token]) if cookies[:auth_token]
end 

我甚至试过这个:

begin
  @current_user ||= User.find_by_auth_token!(cookies[:auth_token]) if cookies[:auth_token]
  rescue ActiveRecord::RecordNotFound => e
  @current_user ||= nil
end

但它只返回零值。 请帮忙。

控制器:

if params[:remember_me]
  cookies.permanent[:auth_token] = user.auth_token
else
  cookies[:auth_token] = user.auth_token
end

编辑: 型号:

before_create :generate_token(:auth_token)
def generate_token(column)
  begin 
    self[column] = SecureRandom.urlsafe_base64
  end while User.exists?(column => self[column])
end

我认为我遇到了before_create的问题。它的写法是否正确?

2 个答案:

答案 0 :(得分:1)

这对我来说很有用,因为浏览器的cookie和保存到用户模型的cookie不一致:

  def current_user
    @current_user ||= User.find_by_auth_token!(cookies[:auth_token]) if cookies[:auth_token]
    rescue ActiveRecord::RecordNotFound => e
    @current_user ||= session[:current_user_id] && User.find_by_id(session[:current_user_id]) # Use find_by_id to get nil instead of an error if user doesn't exist
  end
  helper_method :current_user

对我来说,删除当前登录的用户时会出现此问题。上述代码可以阻止任何错误。

答案 1 :(得分:0)

您似乎无法找到该实例,因为您的网络浏览器中不再存在cookie,存在冲突。因此,您应该清除浏览器的datacache,然后问题就会消失。