Rails Scaffold销毁不按预期工作

时间:2012-09-17 19:00:26

标签: ruby-on-rails

我正在为负责用户注册的模型添加唯一性验证。用户名应该是唯一性。 我在几天前测试时创建了一个用户,我们称之为“example-guy”。然后我从脚手架用户界面中删除了他,现在当尝试将新用户注册为“example-guy”时,它返回该名称已被删除。 那么如何从数据库中修复此问题而不恢复其“生育状态”并修改控制器以实际销毁表项?

或者也许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的活动记录继承的“身份”模型:

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

Identities controllar管理发送到omniauth的注册表单并调用new.html.erb:

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

提前致谢。

1 个答案:

答案 0 :(得分:2)

我不完全确定导致问题的原因,但我遇到了类似的问题,但是使用了基于Devise的用户的电子邮件地址。

我想在不同的用户上重复使用同一封电子邮件。我将原始用户更改为其他电子邮件,但当我尝试使用“现在唯一”电子邮件更新第二个用户时,它无法通过唯一验证。

对具有该电子邮件的用户的查询未返回任何内容。

它似乎与缓存相关的唯一性约束,因为在删除电子邮件地址后重新启动服务器可以解决问题。