1

Postgresとdeviseを使用してRails 4で開発しています。私は次のユーザーモデルを持っています:

# user model
class User < ActiveRecord::Base

  extend FriendlyId
  friendly_id :username, :use => :slugged

  rolify

  devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable

  validates :username, :presence => true, :uniqueness => {:case_sensitive => false}, :length => { :minimum => 3 },
            :format => { :with => /\A[A-Z0-9a-z\w\b\ \-\_\'\!&@#\.]+\z/i,
              :message => "may contain only alphanumeric characters and common special characters." }
  validates :email, :uniqueness => {:case_sensitive => false}, :presence => true, 
            :format => { :with => Devise.email_regexp, :message => "isn't valid"}

  validates :password, length: { in: 6..128 }, on: :create
  validates :password, length: { in: 6..128 }, on: :update, allow_blank: true

  validates :slug, :presence => true

end


# in schema
create_table "users", force: true do |t|
    t.string   "email",                  default: "", null: false
    t.string   "encrypted_password",     default: "", null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "username"
    t.string   "slug"
  end

  add_index "users", ["email"], name: "index_users_on_email", unique: true
  add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
  add_index "users", ["slug"], name: "index_users_on_slug", unique: true
  add_index "users", ["username"], name: "index_users_on_username", unique: true

フィールド email と username は users テーブルの一意のインデックスです。私のユーザー登録ビューはdeviseから作成されました。たとえば、ユーザー名「test」、電子メール「test@example.com」、パスワード「123456」でテスト アカウントを作成します。サインアウトして、同じ情報でサインアップしようとしました。:uniqueness 検証がトリガーされ、サインアップ フォームと一緒にエラーのリストに表示されることを期待していますが、代わりに次のようなフルページ エラーが発生します。

エラー: 重複するキー値が一意の制約 "index_users_on_email" に違反しています 詳細: キー (email)=(test@example.com) は既に存在します。

このエラーが Rails にバブルアップし、Rails の大きなエラー ページが表示されるのではなく、サインアップ フォームの横に「メールは既にアカウントに登録されています」のようなわかりやすい 1 行のエラーとして表示されるようにするにはどうすればよいですか?

4

1 に答える 1

0

問題を特定しました。プラグインの Friendly_id は、あまりフレンドリーではありませんでした。一意性の検証に失敗し、500 内部サーバー エラーが発生します。アプリケーションから削除しました。Stringexライブラリで ActsAsUrl のようなものを使用することを検討してください。削除しました

  extend FriendlyId
  friendly_id :username_copy, :use => :slugged

そして今使っています

acts_as_url :username, :sync_url => true, :url_attribute => :slug

フレンドリーな URL を生成します。

于 2013-05-07T07:13:59.700 に答える