Подтвердить что ты не робот

Как указать devise_parameter_sanitizer для действия редактирования?

Я добавил Devise в мое приложение Rails 4 и успешно добавил имя пользователя и т.д. в модель User. Кроме того, я могу хранить эти поля с помощью ленивого способа и торговли, т.е.

class ApplicationController < ActionController::Base
  before_filter :configure_permitted_parameters, if: :devise_controller?

  protected

    def configure_permitted_parameters
      devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:email, :password, :password_confirmation, :firstname, :middlename, :lastname) } 
    end
end

Однако я пробовал

def configure_permitted_parameters
  devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:email, :password, :password_confirmation, :firstname, :middlename, :lastname) }
  devise_parameter_sanitizer.for(:edit) { |u| u.permit(:email, :password, :password_confirmation, :firstname, :middlename, :lastname) }
end

но это не работает так, как ожидалось (имя пользователя не сохраняется при вызове действием редактирования). Есть ли что-то еще, что мне нужно сделать, чтобы заставить это работать? Спасибо!

4b9b3361

Ответ 1

Еще раз, это вопрос чтения руководства...

Волшебное слово :account_update и, следовательно, рабочая версия становится

def configure_permitted_parameters
  devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:email, :password, :password_confirmation, :firstname, :middlename, :lastname, :nickname) }
  devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:email, :password, :password_confirmation, :current_password, :firstname, :middlename, :lastname, :nickname) }
end

Обратите внимание, что если вы выполняете вход в систему с использованием нестандартных параметров, искомое слово :sign_in (как и ожидалось).

Ответ 2

Для разработчика 4.1 +

class ApplicationController < ActionController::Base    
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:first_name, :last_name, :email])
    devise_parameter_sanitizer.permit(:account_update, keys: [:first_name, :last_name, :phone, :email, bank_attributes: [:bank_name, :bank_account]])
  end
end

Метод .for устарел, теперь мы используем .permit

Первый arg - это имя действия. :sign_up предназначен для создания новых ресурсов Devise (таких как пользователи), а :account_update предназначен для редактирования/обновления ресурса.

Второй arg, :keys содержит массив параметров, которые вы разрешаете.

Если вы хотите nested_attributes, есть пример в :account_update, вы добавляете отдельный массив с ключом <object>_attributes.

Ответ 3

@conciliator верен о волшебном слове: account_update, но здесь ссылка на документацию, на которую он ссылался http://rubydoc.info/github/plataformatec/devise/ Найдите "devise_parameter_sanitizer", и вы увидите следующее:

В Devise есть всего три действия, которые позволяют передать любой набор параметров модели, поэтому требуется дезинфекция. Их имена и разрешенные параметры по умолчанию:

sign_in (Devise::SessionsController#new) - Permits only the authentication keys (like email)
sign_up (Devise::RegistrationsController#create) - Permits authentication keys plus password and password_confirmation
account_update (Devise::RegistrationsController#update) - Permits authentication keys plus password, password_confirmation and current_password

Ответ 4

def configure_permitted_parameters
  devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:email,   :password, :password_confirmation, :current_password, :firstname, :middlename, :lastname, :nickname) }
end