设计中的匿名用户 - rails

时间:2013-01-22 09:35:22

标签: ruby-on-rails authentication registration lazy-evaluation

我是rails的新手,我试图与匿名用户进行简单的身份验证。我遵循了this教程,我有这个错误:

undefined method `find_or_initialize_by_token'

这是我的AnonymousUser模型:

class AnonymousUser < User
  ACCESSIBLE_ATTRS = [:name, :email]
  attr_accessible *ACCESSIBLE_ATTRS, :type, :token, as: :registrant
  def register(params)
    params = params.merge(type: 'User', token: nil)
    self.update_attributes(params, as: :registrant)
  end
end

这是我的用户模型:

class User < ActiveRecord::Base
  devise :database_authenticatable, :confirmable, :lockable, :recoverable,
    :rememberable, :registerable, :trackable, :timeoutable, :validatable,
    :token_authenticatable
  attr_accessible :email, :password, :password_confirmation, :remember_me
end

最后一个重要的是我的 ApplicationController ,它有这个错误:

class ApplicationController < ActionController::Base
  protect_from_forgery

  def authenticate_user!(*args)
    current_user.present? || super(*args)
  end

  def current_user
    super || AnonymousUser.find_or_initialize_by_token(anonymous_user_token).tap do |user|
      user.save(validate: false) if user.new_record?
    end
  end

  private
  def anonymous_user_token
    session[:user_token] ||= SecureRandom.hex(8)
  end
end

有人告诉我,如果AnonymousUser用户继承自User,那么AnonymousUser会有一个名为find_or_initialize_by_token的方法,但我不知道如何修复它。

2 个答案:

答案 0 :(得分:1)

如果您安装了最新的rails,请尝试重构:

# in ApplicationController#current_user

AnonymousUser.find_or_initialize_by_token(anonymous_user_token).tap do |user|
  user.save(validate: false) if user.new_record?
end

这样的事情:

AnonymousUser.safely_find(anonymous_user_token)

并将find_or_initialize_by_tokensave(validate: false)推送到模型中。

答案 1 :(得分:1)

我写了你引用的博客文章,但今天我会用

AnonymousUser.where(anonymous_user_token: anonymous_user_token).first_or_initialize

动态查找器已被弃用AFAIK。

然而,@ Saurabh Jain在他的建议中绝对正确,将该块重构为AnonymousUser上的一个漂亮的小按钮类方法。