Rails 3.2 Omniauth Devise - Добавить пароль - Пропустить текущий пароль - PullRequest
1 голос
/ 26 января 2012

Я использую Omniauth, чтобы позволить пользователям войти (и создать учетную запись) через Facebook, Twitter и Google.

Однако, если пользователь решит больше не использовать эти службы, но продолжит использовать свою учетную запись, он захочет добавить пароль.


Как разрешить пользователю добавлять пароль к своей учетной записи, не вводя current password? *


Когда я позволяю пользователю перейти на edit_user_registration_path(@user), он видит форму ниже:

= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put, name: 'validation'}) do |f|
  = devise_error_messages!

  = f.label :email, class: 'block'
  = f.email_field :email, class: 'large'
  %span.infobar Keep this here unless you'd like to change your email

  = f.label :password, class: 'block'
  = f.password_field :password, class: 'large'
  %span.infobar Leave blank if you don't want to change it

  = f.label :password_confirmation, class: 'block'
  = f.password_field :password_confirmation, class: 'large'

  - if @user.password_required?
    = f.label :current_password, class: 'block'
    = f.password_field :current_password, class: 'large'
    %span.infobar We need your current password to confirm changes

  = f.submit "Update"

user.rb

def password_required?
  (authentications.empty? || !password.blank?) && super
end

Как видите, у меня так, что если @user.password_required?, то покажите поле текущего пароля. Даже если это поле не отображается при попытке создать новый пароль для учетной записи, форма не будет корректно подтверждена, так как требуется текущий пароль.

1 Ответ

3 голосов
/ 27 января 2012

Я только что переписал метод обновления RegistrationsController #:

class RegistrationsController < Devise::RegistrationsController
  def update
    # Override Devise to use update_attributes instead of update_with_password.
    # This is the only change we make.
    if resource.update_attributes(params[resource_name])
      set_flash_message :notice, :updated
      # Line below required if using Devise >= 1.2.0
      sign_in resource_name, resource, :bypass => true
      redirect_to after_update_path_for(resource)
    else
      clean_up_passwords(resource)
      render_with_scope :edit
    end
  end
end

Источник: Как: Разрешить пользователям редактировать свою учетную запись без ввода пароля

...