ユーザー登録を担当するモデルに一意性検証を追加していました。ユーザー名は一意である必要があります。数日前にテストしたときにユーザーを作成しました。これを「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
前もって感謝します。