我是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
的方法,但我不知道如何修复它。
答案 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_token
和save(validate: false)
推送到模型中。
答案 1 :(得分:1)
我写了你引用的博客文章,但今天我会用
AnonymousUser.where(anonymous_user_token: anonymous_user_token).first_or_initialize
动态查找器已被弃用AFAIK。
然而,@ Saurabh Jain在他的建议中绝对正确,将该块重构为AnonymousUser上的一个漂亮的小按钮类方法。