registrationscontroller - ¿Cómo especificar devise_parameter_sanitizer para editar la acción?
rspec rails devise (4)
Para Devise 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
El método .for
está en desuso, ahora usamos .permit
El primer arg es el nombre de la acción. :sign_up
es para crear recursos nuevos de Devise (como usuarios), y :account_update
es para editar / actualizar el recurso.
El segundo arg,: :keys
contiene una matriz de los parámetros que permite.
Si desea nested_attributes
, hay un ejemplo en :account_update
, coloca una matriz por separado con la clave siendo <object>_attributes
.
He agregado Devise a mi aplicación Rails 4 y he agregado correctamente mi nombre de usuario, etc. a mi modelo de Usuario. Además, puedo almacenar esos campos usando lazy way ™, es decir,
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
Sin embargo, lo intenté
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
pero eso no funcionó del todo como se esperaba (el nombre de usuario no se almacena cuando la acción de edición lo invoca). ¿Hay algo más que deba hacer para que funcione? ¡Gracias!
@conciliator tiene razón acerca de la palabra mágica es: account_update pero aquí está el enlace a la documentación que aludió a http://rubydoc.info/github/plataformatec/devise/ Busque ''devise_parameter_sanitizer'' y verá lo siguiente:
Solo hay tres acciones en Devise que permiten que cualquier conjunto de parámetros se transmita al modelo, por lo que requieren desinfección. Sus nombres y los parámetros permitidos por defecto son:
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
Una vez más, era cuestión de leer el manual ...
La palabra mágica es :account_update
y así la versión de trabajo se convierte
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
Tenga en cuenta que si está en el negocio de iniciar :sign_in
utilizando parámetros no estándar, la palabra que está buscando es :sign_in
(como se esperaba).
def configure_permitted_parameters
devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:email, :password, :password_confirmation, :current_password, :firstname, :middlename, :lastname, :nickname) }
end