3

我是 Rails 新手,我尝试使用匿名用户进行简单的身份验证。我按照教程进行操作,但出现此错误:

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,但我不知道如何修复它。

4

2 回答 2

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_token并将和推save(validate: false)入模型。

于 2013-01-22T10:00:38.020 回答
1

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

AnonymousUser.where(anonymous_user_token: anonymous_user_token).first_or_initialize

AFAIK 已弃用动态查找器。

但是,@Saurabh Jain 在他的建议中是绝对正确的,即将该块重构为 AnonymousUser 上一个不错的小按钮类方法。

于 2013-03-14T21:18:47.133 回答