0

ユーザー登録を担当するモデルに一意性検証を追加していました。ユーザー名は一意である必要があります。数日前にテストしたときにユーザーを作成しました。これを「example-guy」と呼びましょう。次に、彼をscaffoldのユーザーインターフェイスから削除しました。新しいユーザーを「example-guy」として登録しようとすると、名前がすでに使用されていることが返されます。では、「誕生状態」に戻らずにDBからこれを修正し、実際にテーブルエントリを破棄するようにコントローラを変更するにはどうすればよいでしょうか。

あるいは、Railsは、破棄された後でも、DBに書き込まれた内容を追跡しているのでしょうか。

ユーザーモデルであるomniauth-identityを使用しています。

class User < ActiveRecord::Base
  attr_accessible :name, :provider, :uid, :email
  # This is a class method, callable from SessionsController
  # hence the "User."
  def User.create_with_omniauth(auth)
    user = User.new()
    user.provider = auth["provider"]
    user.uid = auth["uid"]
    user.name = auth["info"]["name"]
    # ADD EMAIL
    user.email = auth["info"]["email"]
    user.save
    return user
  end
end

ユーザーコントローラーの破棄機能:

  # DELETE /users/1
  # DELETE /users/1.json
  def destroy
    @user = User.find(params[:id])
    @user.destroy

    respond_to do |format|
      format.html { redirect_to users_url }
      format.json { head :no_content }
    end
  end
end

検証は、omniauthのアクティブレコードから継承された「ID」モデルで行われます。

class Identity < OmniAuth::Identity::Models::ActiveRecord
  attr_accessible :email, :name, :password_digest, :password, :password_confirmation
  #attr_accessible :email, :name, :password_digest :password, :password confirmation
  validates_presence_of :name
  validates_uniqueness_of :name
  validates_length_of :name, :in => 6..24
  validates_format_of :name, :with => /^[a-z]+$/
  validate :name_blacklist

  validates_uniqueness_of :email, :case_sensitive => false
  validates_format_of :email,
  :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i,
  :message => "doesn't look like a proper email address"
  #validates_presence_of :password, on: :create
  #validates_presence_of :password_confirmation
  validates_length_of :password, :in => 6..24

  def name_blacklist
    unless self.name.blank? then
      case self.name
      when "user", "photo", "photos",
        "application", "sessions",
        "identities", "home"
          self.errors.add(:name, "prohibited")
      end
    end
  end
end

IDコントローラーは、omniauthに送信され、new.html.erbを呼び出す登録フォームを管理します。

class IdentitiesController < ApplicationController
  def new
    @identity = env['omniauth.identity']
  end
end

前もって感謝します。

4

1 に答える 1

2

問題の原因は完全にはわかりませんが、同様の問題が発生しましたが、Deviseベースのユーザーの電子メールアドレスに問題がありました。

同じメールを別のユーザーで再利用したいと思っていました。元のユーザーを別の電子メールに変更しましたが、2番目のユーザーを「現在一意の」電子メールで更新しようとすると、一意の検証に失敗しました。

その電子メールを持つユーザーへのクエリは何も返しませんでした。

メールアドレスを削除した後、サーバーを再起動すると問題が修正されたため、これは一意性の制約にキャッシュに関連しているように見えました。

于 2012-10-16T10:41:06.970 に答える