2010-11-04 39 views
12

Tôi đã triển khai omniauth với mô hình dự đoán của mình, vì vậy tôi có thể xác thực bằng các dịch vụ khác. Mật khẩu không còn cần thiết nữa đối với mô hình của tôi, vì người dùng có thể xác thực bằng twitter, facebook ...Rails 3 - Devise: Cách bỏ qua 'current_password' khi chỉnh sửa đăng ký?

Mọi thứ đang hoạt động tốt, nhưng khi người dùng cố gắng chỉnh sửa đăng ký, hãy bỏ qua quá trình vì người dùng không thông báo 'current_password' (hiện không tồn tại trong một số trường hợp).

Tôi tạo ra một bộ điều khiển đăng ký để ghi đè lên devises một:

class RegistrationsController < Devise::RegistrationsController 
    def update 
    super 
    end 
end 

Nhưng tôi đã không tìm thấy bất kỳ tài liệu về làm thế nào để bỏ qua việc xác minh mật khẩu, làm thế nào tôi có thể làm điều đó trong hành động cập nhật của tôi?

Trả lời

34

Tương tự như trên, hãy thử đặt này trong mô hình sử dụng của bạn:

# bypasses Devise's requirement to re-enter current password to edit 
def update_with_password(params={}) 
    if params[:password].blank? 
    params.delete(:password) 
    params.delete(:password_confirmation) if params[:password_confirmation].blank? 
    end 
    update_attributes(params) 
end 
+0

thực sự tốt đẹp. hoạt động hoàn hảo! – Tronic

+0

Nó hoạt động! Cảm ơn, tôi yêu bạn! – rodrigoalves

+4

Có thể cần thêm một cuộc gọi vào 'clean_up_passwords'. Sau khi lưu, nó đặt các thuộc tính 'password' và' password_confirmation' thành nil để giữ bí mật mật khẩu của người dùng. Xem phần [update_with_password implementation của Devise] (https://github.com/plataformatec/devise/blob/master/lib/devise/models/database_authenticatable.rb#L56) để tham khảo. –

10

Sau đây làm việc cho tôi:

Trong điều khiển người dùng của tôi, trong hành động cập nhật, tôi có

params[:user].delete(:password) if params[:user][:password].blank? 
params[:user].delete(:password_confirmation) if params[:user][:password_confirmation].blank? 

lẽ bạn có thể thích nghi với điều đó với một callback before_save?

1

Ngay cả những câu trả lời là ở đây trong một thời gian tôi muốn gửi một hình mới, như tôi nghĩ câu trả lời đã chọn có một sai sót nhỏ . Có lẽ nó không có tại thời điểm này câu trả lời đã được tạo ra, nhưng bây giờ trong 2013, câu trả lời sẽ là như thế này:

Các giải pháp sẽ được tạo ra trong User mô hình như thế này:

# bypass re-entering current password for edit 
    def update_with_password(params={}) 
    current_password = params.delete(:current_password) 

    if params[:password].blank? 
     params.delete(:password) 
     params.delete(:password_confirmation) if params[:password_confirmation].blank? 
    end 
    update_attributes(params) 

    clean_up_passwords 
    end 
+0

Nhưng điều gì sẽ ở phương thức cập nhật RegistrationsController #? –

+0

Không có gì. Không nên tạo bộ điều khiển đăng ký. Giải pháp sẽ là tạo CHỈ trong mô hình Người dùng như tôi đã đưa vào câu trả lời của tôi và không tạo ra bất kỳ lớp bổ sung nào như được nói trong câu hỏi. – Aleks

0

có là một câu trả lời dễ dàng hơn, tôi không biết khi nào devise đầu tiên có phương pháp này nhưng bởi chỉ cần thêm

Model.update_without_password(params)

nó sẽ cập nhật các thuộc tính mà không cần mật khẩu hiện tại.

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