2011-08-17 16 views
17

Tôi thiết lập Devise để đăng nhập bằng tên người dùng thay vì địa chỉ email vì số lượng người dùng của chúng tôi chia sẻ cùng địa chỉ email với vợ/chồng của họ. Đó là một thị trường duy nhất mà chúng tôi phục vụ. Nhưng mỗi người phối ngẫu cần có tài khoản riêng để ghi lại kết quả công cụ tính cách.Phát triển - cách thay đổi cài đặt để địa chỉ email không cần phải là duy nhất

Cơ sở dữ liệu không còn yêu cầu địa chỉ email duy nhất để nó sẽ chấp nhận cùng một addy email cho hai tài khoản. Tuy nhiên, Devise vẫn yêu cầu một địa chỉ email duy nhất cho mỗi tài khoản. Có một thiết lập hoặc một công việc xung quanh mà tôi có thể sử dụng để thay đổi điều này?

Trả lời

13

Tìm trong số config/initializers/devise.rb. Bạn có thể thay đổi khóa xác thực mặc định, mà theo mặc định là :email được bất cứ điều gì bạn muốn, ví dụ:

config.authentication_keys = [ :username ]

+0

Tôi đã làm điều đó. Devise vẫn yêu cầu một địa chỉ email duy nhất. Cảm ơn sáng kiến ​​của bạn mặc dù. – Jay

+6

Trong trường hợp đó, hãy xóa: hợp lệ hóa khỏi mô hình và bạn sẽ ổn. Thêm xác thực tùy chỉnh của riêng bạn nếu cần. – eugen

+12

Rất tiếc, việc xóa ': validatable' sẽ xóa rất nhiều nội dung hữu ích khác, ví dụ: xác thực mật khẩu. Trong các phiên bản gần đây của Devise bạn cũng có thể thực hiện 'email_required?' Trên mô hình của bạn. Điều này sẽ bỏ qua xác nhận email nếu 'false' được trả về, xem https://github.com/plataformatec/devise/pull/545 – malclocke

-1

Vì vậy, đây thực sự là cũ ... nhưng Tôi nghĩ tôi sẽ trả lời.

Tôi đang sử dụng phiên bản cũ của bản phát hành (1.4.9), nhưng thông qua một số trợ giúp trong #rubyonrails trên freenode, tôi thấy rằng bạn phải chỉnh sửa lib/devise/models/validatable.rb:

module Devise 
    module Models 
    module Validatable 
     # All validations used by this module. 
     VALIDATIONS = [ :validates_presence_of, :validates_uniqueness_of, :validates_format_of, 
         :validates_confirmation_of, :validates_length_of ].freeze 

     def self.included(base) 
     base.extend ClassMethods 
     assert_validations_api!(base) 

     base.class_eval do 
      validates_presence_of :email, :if => :email_required? 
      # commented out so that we don't check for unique emails 
      #validates_uniqueness_of :email, :case_sensitive => (case_insensitive_keys != false), :allow_blank => true, :if => :email_changed? 
      validates_format_of :email, :with => email_regexp, :allow_blank => true, :if => :email_changed? 

      validates_presence_of :password, :if => :password_required? 
      validates_confirmation_of :password, :if => :password_required? 
      validates_length_of :password, :within => password_length, :allow_blank => true 
     end 
     end 
    end 
    end 
end 

Điều này cũng bắt buộc phải đi vào cơ sở dữ liệu và thay đổi chỉ mục trên cột email, được đặt thành duy nhất ngoài hộp.

42

= Người dùng mẫu

def email_required? 
    false 
end 

def email_changed? 
    false 
end 

= Migration

rails g migration update_index_on_users 
def up 
    sql = 'DROP INDEX index_users_on_email' 
    sql << ' ON users' if Rails.env == 'production' # Heroku pg 
    ActiveRecord::Base.connection.execute(sql) 
end 
+0

Đây là những gì làm việc cho tôi. Chúc mừng! – asgeo1

+1

những gì Erik Jacobs viết dưới đây xác nhận phương pháp này, kể từ khi xác nhận ông nhận xét ra có thể bị vô hiệu hóa bởi 'email_changed?'. Tôi hơi thích những gì Moin Haidar đã làm ở đây, vì bạn không cần phải chỉnh sửa mã Devise theo cách này. – semiomant

+1

Di chuyển có thể là: 'remove_index: users,: email' –

0

Nếu bạn chỉ muốn loại bỏ uniqueness validation được đưa ra bởi devise và giữ những người khác, tham khảo this (ví rails> = 4.1.6) .

Các vấn đề liên quan