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

最新のレールがインストールされている場合は、リファクタリングしてみてください。

# 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)をモデルにプッシュします。

于 2013-01-22T10:00:38.020 に答える
1

私はあなたが参照したブログ投稿を書きましたが、今日、私は

AnonymousUser.where(anonymous_user_token: anonymous_user_token).first_or_initialize

動的ファインダーは、知る限り廃止されています。

ただし、@Saurabh Jain は、そのブロックを AnonymousUser の素敵な小さなプッシュボタン クラス メソッドにリファクタリングするという彼の提案で絶対に正しいです。

于 2013-03-14T21:18:47.133 に答える