2013-03-08 30 views
25

Tôi sử dụng ActiveAdmin làm phụ trợ quản trị trong ứng dụng đường ray của mình. Về cơ bản, tôi có một admin_user và một mô hình người dùng.ActiveAdmin: cách giữ nguyên mật khẩu người dùng?

Khi tôi tạo người dùng mới từ tài khoản quản trị, tôi chỉ định email và mật khẩu, điều đó là ok.

Giả sử sau đó tôi muốn sửa đổi email của người dùng chứ không phải mật khẩu ... có vẻ như không thể thực hiện được vì trường mật khẩu không được để trống khi cập nhật người dùng.

Có cấu hình nào đó sẽ xem xét mật khẩu không thay đổi là các trường (mật khẩu và password_confirmation) được để trống trong khi cập nhật người dùng?

+0

bạn đang sử dụng để xác thực? –

+0

'có vẻ như' nghĩa là gì? bạn có nhận được lỗi xác nhận hay không? – phoet

+0

Có, tôi sử dụng thiết lập. "Có vẻ như" có nghĩa là tôi không tìm được cách để làm điều đó vì trường mật khẩu không thể để trống. – Luc

Trả lời

20

Devise cung cấp phương thức update_without_password mà bạn có thể sử dụng khi cập nhật người dùng nếu không nhập mật khẩu. Sử dụng phương pháp đó, bạn có thể tùy chỉnh phương thức cập nhật trong bộ điều khiển người dùng ActiveAdmin của mình.

def update 
    @user = User.find(params[:id]) 
    if params[:user][:password].blank? 
    @user.update_without_password(params[:user]) 
    else 
    @user.update_attributes(params[:user]) 
    end 
    if @user.errors.blank? 
    redirect_to admin_users_path, :notice => "User updated successfully." 
    else 
    render :edit 
    end 
end 

Devise Wiki có thêm thông tin về phương pháp này nếu bạn quan tâm.

+0

Có, và đây là một cách khác để làm điều đó http://stackoverflow.com/a/11676957/633742 –

85

Bạn không thực sự cần đến mớ hỗn độn ở tất cả với bộ điều khiển đăng ký lập mưu, bạn chỉ có thể bỏ qua các lĩnh vực mật khẩu rỗng bên trong bộ điều khiển nguồn ActiveAdmin của:

ActiveAdmin.register User do 

    controller do 

    model = :user 

    if params[model][:password].blank? 
     %w(password password_confirmation).each { |p| params[model].delete(p) } 
    end 

    super 

    end 

end 
+1

Bạn nói đúng, điều này có lẽ là sạch hơn và được bản địa hóa. – Luc

+2

Thanh lịch! Cám ơn vì đã chia sẻ. – scarver2

+2

Tôi có thể tìm tệp này ở đâu? là ok để đặt nó trong 'config/initializers/rails_admin.rb'? –

9

Bạn cần phải đánh giá mật khẩu và password_confirmation trong câu lệnh if, để áp dụng kiểm chứng thực về "password_confirmation", ví dụ như đối với trường hợp của tôi:

#app/admin/user.rb 
controller do 
    def update 
    if params[:user][:password].blank? && params[:user][:password_confirmation].blank? 
     params[:user].delete("password") 
     params[:user].delete("password_confirmation") 
    end 
    super 
    end 
end 


#app/model/user.rb 
validates :name, :email, presence: true 
validates :password, :password_confirmation, presence: true, on: :create 
validates :password, confirmation: true 

này cho phép tôi để xác nhận sự hiện diện mật khẩu chỉ khi tôi tạo một người dùng mới và cập nhật mà không cần thay đổi mật khẩu của mình.

Tác phẩm này dành cho tôi, tôi hy vọng điều này hữu ích.

Tôi hy vọng điều này hữu ích.

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