0

编辑:感谢@vinodadhikary - 经过进一步调查,似乎错误发生在 a)电子邮件不是唯一的,b)名称不是唯一的或 c)电子邮件显然是假的(h@h.com)。如果 Devise 不接受注册,我希望错误能够优雅地发生。如果密码不匹配或字段不完整,则错误处理是正确的。此外,非唯一名称应该不是问题吗?这是由使用 FriendlyID 创建 slug(使用名称作为 slug)引起的吗?

原文:当有人在满足上述注册条件之一时注册时,我在我的 Devise 注册中遇到了一个奇怪的错误。我认为我没有为 Devise 安装做任何超出正常范围的事情(使用 Rails Composer,如果重要的话)。在此先感谢您的帮助...

这是错误:

SQLite3::ConstraintException: constraint failed: INSERT INTO "users"
("avatar_content_type", "avatar_file_name", "avatar_file_size", "avatar_updated_at", 
"confirmation_sent_at", "confirmation_token", "confirmed_at", "created_at",     
"current_sign_in_at", "current_sign_in_ip", "email", "encrypted_password", 
"fully_registered", "last_sign_in_at", "last_sign_in_ip", "name", "remember_created_at", 
"reset_password_sent_at", "reset_password_token", "sign_in_count", "slug", 
"unconfirmed_email", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 
?, ?, ?, ?, ?, ?, ?, ?)

设计/注册/new.html.haml:

%section.row-fluid.sign-up
  .container-fluid
    .span6.landing-left
      %h1 Sign Up!
      .form-inputs
        = simple_form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => {:class => 'form-vertical' }) do |f|
          = f.error_notification
          = display_base_errors resource
          = f.input :name, :autofocus => true, :placeholder => "Your Name", label: false
          = f.input :email, :required => true, :placeholder => "Your Email", label: false
          = f.input :password, :required => true, :placeholder => "Password", label: false
          = f.input :password_confirmation, :required => true, :placeholder => "Password Confirmation", label: false
          = f.button :submit, 'Join L', :class => 'btn button'
      %p
        = link_to "or, Sign In", new_user_session_url

用户.rb:

class User < ActiveRecord::Base
  rolify

  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable,
  # :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :confirmable

  after_create :assign_default_role

  # Setup accessible (or protected) attributes for your model
  attr_accessible :role_ids, :as => :admin
  attr_accessible :name, :email, :password, :password_confirmation, :remember_me, :fully_registered, :avatar

  has_one :profile, dependent: :destroy

  has_many :appointments, foreign_key: "host_id"
  has_many :appointments, foreign_key: "attendee_id"

  has_many :reviews, foreign_key: "reviewee_id"
  has_many :reviewed_users, foreign_key: "reviewer_id", class_name: "Review"

  validates_attachment :avatar,
                          content_type: { content_type: ['image/jpeg', 'image/jpg', 'image/png', 'image/gif'] },
                          size: { less_than: 1.megabytes }


  extend FriendlyId
  friendly_id :name, use: [:slugged, :history]

  has_attached_file :avatar, styles: {
    thumb: '100x100>',
    square: '200x200#',
    medium: '300x300>'
  }, default_url: 'https://s3.amazonaws.com/l/layout/elements/placeholders/image_placeholder.svg'


  def get_review_score
    reviews.average('rating').to_f
  end

  protected

  # def confirmation_required?
  #   false
  # end

  def assign_default_role
    # Default Role: User, ID: 2
    add_role(:user)
  end

end

全栈跟踪:

Started POST "/users" for 127.0.0.1 at 2013-07-17 19:20:23 -0400
Processing by Devise::RegistrationsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"Vl2A8qW8GLCF7elJIQkw4FCBcRd7Oaz1O9yJth3Wg6g=", "user"=>{"name"=>"Henry", "email"=>"h.h@gmail.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Join L"}
   (0.1ms)  begin transaction
  FriendlyId::Slug Load (0.3ms)  SELECT "friendly_id_slugs".* FROM "friendly_id_slugs" WHERE "friendly_id_slugs"."sluggable_type" = 'User' AND (slug = 'henry' OR slug LIKE 'henry--%') ORDER BY LENGTH(slug) DESC, slug DESC LIMIT 1
  User Exists (0.1ms)  SELECT 1 AS one FROM "users" WHERE "users"."email" = 'h.h@gmail.com' LIMIT 1
  User Load (0.1ms)  SELECT "users".* FROM "users" WHERE "users"."confirmation_token" = 'W6sjj2MZ1wxqxEfrFxYM' LIMIT 1
Binary data inserted for `string` type on column `encrypted_password`
  SQL (1.0ms)  INSERT INTO "users" ("avatar_content_type", "avatar_file_name", "avatar_file_size", "avatar_updated_at", "confirmation_sent_at", "confirmation_token", "confirmed_at", "created_at", "current_sign_in_at", "current_sign_in_ip", "email", "encrypted_password", "fully_registered", "last_sign_in_at", "last_sign_in_ip", "name", "remember_created_at", "reset_password_sent_at", "reset_password_token", "sign_in_count", "slug", "unconfirmed_email", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)  [["avatar_content_type", nil], ["avatar_file_name", nil], ["avatar_file_size", nil], ["avatar_updated_at", nil], ["confirmation_sent_at", Wed, 17 Jul 2013 19:20:23 EDT -04:00], ["confirmation_token", "W6sjj2MZ1wxqxEfrFxYM"], ["confirmed_at", nil], ["created_at", Wed, 17 Jul 2013 19:20:23 EDT -04:00], ["current_sign_in_at", nil], ["current_sign_in_ip", nil], ["email", "h.h@gmail.com"], ["encrypted_password", "$2a$10$4XffwFcxoq4a8bDvUTvTauZNkUkKB/KgY.FZU4pxOH.pLmkL/JGvi"], ["fully_registered", false], ["last_sign_in_at", nil], ["last_sign_in_ip", nil], ["name", "Henry"], ["remember_created_at", nil], ["reset_password_sent_at", nil], ["reset_password_token", nil], ["sign_in_count", 0], ["slug", "henry--2"], ["unconfirmed_email", nil], ["updated_at", Wed, 17 Jul 2013 19:20:23 EDT -04:00]]
SQLite3::ConstraintException: constraint failed: INSERT INTO "users" ("avatar_content_type", "avatar_file_name", "avatar_file_size", "avatar_updated_at", "confirmation_sent_at", "confirmation_token", "confirmed_at", "created_at", "current_sign_in_at", "current_sign_in_ip", "email", "encrypted_password", "fully_registered", "last_sign_in_at", "last_sign_in_ip", "name", "remember_created_at", "reset_password_sent_at", "reset_password_token", "sign_in_count", "slug", "unconfirmed_email", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
   (0.1ms)  rollback transaction
Completed 500 Internal Server Error in 81ms

ActiveRecord::StatementInvalid - SQLite3::ConstraintException: constraint failed: INSERT INTO "users" ("avatar_content_type", "avatar_file_name", "avatar_file_size", "avatar_updated_at", "confirmation_sent_at", "confirmation_token", "confirmed_at", "created_at", "current_sign_in_at", "current_sign_in_ip", "email", "encrypted_password", "fully_registered", "last_sign_in_at", "last_sign_in_ip", "name", "remember_created_at", "reset_password_sent_at", "reset_password_token", "sign_in_count", "slug", "unconfirmed_email", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?):
  activerecord (3.2.13) lib/active_record/connection_adapters/abstract_adapter.rb:285:in `rescue in log'
  activerecord (3.2.13) lib/active_record/connection_adapters/abstract_adapter.rb:275:in `log'
  activerecord (3.2.13) lib/active_record/connection_adapters/sqlite_adapter.rb:242:in `exec_query'
  activerecord (3.2.13) lib/active_record/connection_adapters/abstract/database_statements.rb:63:in `exec_insert'
  activerecord (3.2.13) lib/active_record/connection_adapters/abstract/database_statements.rb:90:in `insert'
  activerecord (3.2.13) lib/active_record/connection_adapters/abstract/query_cache.rb:14:in `insert'
  activerecord (3.2.13) lib/active_record/relation.rb:66:in `insert'
  activerecord (3.2.13) lib/active_record/persistence.rb:367:in `create'
  activerecord (3.2.13) lib/active_record/timestamp.rb:58:in `create'
  activerecord (3.2.13) lib/active_record/callbacks.rb:268:in `block in create'
  activesupport (3.2.13) lib/active_support/callbacks.rb:414:in `_run__2609459987145809617__create__3448311305093244115__callbacks'
  activesupport (3.2.13) lib/active_support/callbacks.rb:405:in `__run_callback'
  activesupport (3.2.13) lib/active_support/callbacks.rb:385:in `_run_create_callbacks'
  activesupport (3.2.13) lib/active_support/callbacks.rb:81:in `run_callbacks'
  activerecord (3.2.13) lib/active_record/callbacks.rb:268:in `create'
  activerecord (3.2.13) lib/active_record/persistence.rb:348:in `create_or_update'
  activerecord (3.2.13) lib/active_record/callbacks.rb:264:in `block in create_or_update'
  activesupport (3.2.13) lib/active_support/callbacks.rb:425:in `_run__2609459987145809617__save__3448311305093244115__callbacks'
  activesupport (3.2.13) lib/active_support/callbacks.rb:405:in `__run_callback'
  activesupport (3.2.13) lib/active_support/callbacks.rb:385:in `_run_save_callbacks'
  activesupport (3.2.13) lib/active_support/callbacks.rb:81:in `run_callbacks'
  activerecord (3.2.13) lib/active_record/callbacks.rb:264:in `create_or_update'
  activerecord (3.2.13) lib/active_record/persistence.rb:84:in `save'
  activerecord (3.2.13) lib/active_record/validations.rb:50:in `save'
  activerecord (3.2.13) lib/active_record/attribute_methods/dirty.rb:22:in `save'
  activerecord (3.2.13) lib/active_record/transactions.rb:259:in `block (2 levels) in save'
  activerecord (3.2.13) lib/active_record/transactions.rb:313:in `block in with_transaction_returning_status'
  activerecord (3.2.13) lib/active_record/connection_adapters/abstract/database_statements.rb:192:in `transaction'
  activerecord (3.2.13) lib/active_record/transactions.rb:208:in `transaction'
  activerecord (3.2.13) lib/active_record/transactions.rb:311:in `with_transaction_returning_status'
  activerecord (3.2.13) lib/active_record/transactions.rb:259:in `block in save'
  activerecord (3.2.13) lib/active_record/transactions.rb:270:in `rollback_active_record_state!'
  activerecord (3.2.13) lib/active_record/transactions.rb:258:in `save'
  devise (2.2.4) app/controllers/devise/registrations_controller.rb:15:in `create'
  actionpack (3.2.13) lib/action_controller/metal/implicit_render.rb:4:in `send_action'
  actionpack (3.2.13) lib/abstract_controller/base.rb:167:in `process_action'
  actionpack (3.2.13) lib/action_controller/metal/rendering.rb:10:in `process_action'
  actionpack (3.2.13) lib/abstract_controller/callbacks.rb:18:in `block in process_action'
  activesupport (3.2.13) lib/active_support/callbacks.rb:436:in `_run__1922468707363096533__process_action__814005644436315713__callbacks'
  activesupport (3.2.13) lib/active_support/callbacks.rb:405:in `__run_callback'
  activesupport (3.2.13) lib/active_support/callbacks.rb:385:in `_run_process_action_callbacks'
  activesupport (3.2.13) lib/active_support/callbacks.rb:81:in `run_callbacks'
  actionpack (3.2.13) lib/abstract_controller/callbacks.rb:17:in `process_action'
  actionpack (3.2.13) lib/action_controller/metal/rescue.rb:29:in `process_action'
  actionpack (3.2.13) lib/action_controller/metal/instrumentation.rb:30:in `block in process_action'
  activesupport (3.2.13) lib/active_support/notifications.rb:123:in `block in instrument'
  activesupport (3.2.13) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
  activesupport (3.2.13) lib/active_support/notifications.rb:123:in `instrument'
  actionpack (3.2.13) lib/action_controller/metal/instrumentation.rb:29:in `process_action'
  actionpack (3.2.13) lib/action_controller/metal/params_wrapper.rb:207:in `process_action'
  activerecord (3.2.13) lib/active_record/railties/controller_runtime.rb:18:in `process_action'
  actionpack (3.2.13) lib/abstract_controller/base.rb:121:in `process'
  actionpack (3.2.13) lib/abstract_controller/rendering.rb:45:in `process'
  actionpack (3.2.13) lib/action_controller/metal.rb:203:in `dispatch'
  actionpack (3.2.13) lib/action_controller/metal/rack_delegation.rb:14:in `dispatch'
  actionpack (3.2.13) lib/action_controller/metal.rb:246:in `block in action'
  actionpack (3.2.13) lib/action_dispatch/routing/route_set.rb:73:in `dispatch'
  actionpack (3.2.13) lib/action_dispatch/routing/route_set.rb:36:in `call'
  actionpack (3.2.13) lib/action_dispatch/routing/mapper.rb:42:in `call'
  journey (1.0.4) lib/journey/router.rb:68:in `block in call'
  journey (1.0.4) lib/journey/router.rb:56:in `call'
  actionpack (3.2.13) lib/action_dispatch/routing/route_set.rb:612:in `call'
  warden (1.2.1) lib/warden/manager.rb:35:in `block in call'
  warden (1.2.1) lib/warden/manager.rb:34:in `call'
  actionpack (3.2.13) lib/action_dispatch/middleware/best_standards_support.rb:17:in `call'
  rack (1.4.5) lib/rack/etag.rb:23:in `call'
  rack (1.4.5) lib/rack/conditionalget.rb:35:in `call'
  actionpack (3.2.13) lib/action_dispatch/middleware/head.rb:14:in `call'
  actionpack (3.2.13) lib/action_dispatch/middleware/params_parser.rb:21:in `call'
  actionpack (3.2.13) lib/action_dispatch/middleware/flash.rb:242:in `call'
  rack (1.4.5) lib/rack/session/abstract/id.rb:210:in `context'
  rack (1.4.5) lib/rack/session/abstract/id.rb:205:in `call'
  actionpack (3.2.13) lib/action_dispatch/middleware/cookies.rb:341:in `call'
  activerecord (3.2.13) lib/active_record/query_cache.rb:64:in `call'
  activerecord (3.2.13) lib/active_record/connection_adapters/abstract/connection_pool.rb:479:in `call'
  actionpack (3.2.13) lib/action_dispatch/middleware/callbacks.rb:28:in `block in call'
  activesupport (3.2.13) lib/active_support/callbacks.rb:405:in `_run__2361827533017433596__call__3448311305093244115__callbacks'
  activesupport (3.2.13) lib/active_support/callbacks.rb:405:in `__run_callback'
  activesupport (3.2.13) lib/active_support/callbacks.rb:385:in `_run_call_callbacks'
  activesupport (3.2.13) lib/active_support/callbacks.rb:81:in `run_callbacks'
  actionpack (3.2.13) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
  actionpack (3.2.13) lib/action_dispatch/middleware/reloader.rb:65:in `call'
  actionpack (3.2.13) lib/action_dispatch/middleware/remote_ip.rb:31:in `call'
  better_errors (0.9.0) lib/better_errors/middleware.rb:84:in `protected_app_call'
  better_errors (0.9.0) lib/better_errors/middleware.rb:79:in `better_errors_call'
  better_errors (0.9.0) lib/better_errors/middleware.rb:56:in `call'
  actionpack (3.2.13) lib/action_dispatch/middleware/debug_exceptions.rb:16:in `call'
  actionpack (3.2.13) lib/action_dispatch/middleware/show_exceptions.rb:56:in `call'
  railties (3.2.13) lib/rails/rack/logger.rb:32:in `call_app'
  railties (3.2.13) lib/rails/rack/logger.rb:16:in `block in call'
  activesupport (3.2.13) lib/active_support/tagged_logging.rb:22:in `tagged'
  railties (3.2.13) lib/rails/rack/logger.rb:16:in `call'
  quiet_assets (1.0.2) lib/quiet_assets.rb:18:in `call_with_quiet_assets'
  actionpack (3.2.13) lib/action_dispatch/middleware/request_id.rb:22:in `call'
  rack (1.4.5) lib/rack/methodoverride.rb:21:in `call'
  rack (1.4.5) lib/rack/runtime.rb:17:in `call'
  activesupport (3.2.13) lib/active_support/cache/strategy/local_cache.rb:72:in `call'
  rack (1.4.5) lib/rack/lock.rb:15:in `call'
  actionpack (3.2.13) lib/action_dispatch/middleware/static.rb:63:in `call'
  railties (3.2.13) lib/rails/engine.rb:479:in `call'
  railties (3.2.13) lib/rails/application.rb:223:in `call'
  rack (1.4.5) lib/rack/content_length.rb:14:in `call'
  railties (3.2.13) lib/rails/rack/log_tailer.rb:17:in `call'
  rack (1.4.5) lib/rack/handler/webrick.rb:59:in `service'
  /usr/local/rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/webrick/httpserver.rb:138:in `service'
  /usr/local/rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/webrick/httpserver.rb:94:in `run'
  /usr/local/rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/webrick/server.rb:191:in `block in start_thread'



Started POST "/__better_errors/70311741936300/variables" for 127.0.0.1 at 2013-07-17 19:20:23 -0400
4

1 回答 1

0

因此,FriendlyId 因某种未知原因而窒息创建某个 slug 的多次迭代(在 henry 和 henry--2 后卡住,henry--3 抛出错误)。我通过将 slug 属性更改为 email、运行 find_each(&:save) 来清除当前的 slug 并在将 slug 返回名称后执行相同操作来解决此问题。这解决了看起来的问题。

展望未来,我将切换到唯一的用户名,因为使用名称(不必是唯一的)太难看了。

感谢@bdares 和@vinodadhikary 的帮助

于 2013-07-18T14:12:43.973 回答