ruby on rails - ejemplos - Parámetros no permitidos que agregan nuevos campos a Devise in rails 4.0
ruby on rails tutorial (7)
Aquí hay otra forma directa que funciona en mi aplicación Rails 4.2.1:
Crea el siguiente archivo
/config/initializers/devise_permitted_parameters.rb
y el código ..
module DevisePermittedParameters
extend ActiveSupport::Concern
included do
before_filter :configure_permitted_parameters
end
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) << :name
devise_parameter_sanitizer.for(:account_update) << :name
devise_parameter_sanitizer.for(:sign_up) << :bio
devise_parameter_sanitizer.for(:account_update) << :bio
end
end
DeviseController.send :include, DevisePermittedParameters
Muy nuevo para trabajar con rieles. He implementado un sistema de inicio de sesión básico utilizando Devise. Estoy intentando agregar un par de campos nuevos (bio: string, name: string) en la página de inicio de sesión. Tengo todo lo que se muestra correctamente y los nuevos campos se agregan a la base de datos (cuando lo veo en SQLbrowser), sin embargo, no se están llenando y después de que el usuario envía el formulario de inicio de sesión hay un mensaje que dice:
Unpermitted parameters: bio, name
He añadido las 2 cadenas al _devise_create_users.rb
# added
t.string :bio
t.string :name
Y los tengo apareciendo en el esquema.rb
ActiveRecord::Schema.define(version: 20130629002343) do
create_table "users", force: true do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer "sign_in_count", default: 0
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.string "current_sign_in_ip"
t.string "last_sign_in_ip"
t.datetime "created_at"
t.datetime "updated_at"
t.string "shortbio"
t.boolean "admin", default: false
t.string "realname"
t.string "name"
t.string "bio"
end
add_index "users", ["email"], name: "index_users_on_email", unique: true
add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
end
Mi usuario.rb
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
#:token_authenticatable, :confirmable,
#:lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
end
¿Es este problema algo que ver con parámetros fuertes? Estoy teniendo dificultades para envolver mi cabeza alrededor de ellos y dónde / cómo implementar.
Asegúrese de que está utilizando Devise 3.0.0 al menos. Agregue a su controlador de aplicación:
before_filter :update_sanitized_params, if: :devise_controller?
def update_sanitized_params
devise_parameter_sanitizer.for(:sign_up) {|u| u.permit(:bio, :name)}
end
Documentación: https://github.com/plataformatec/devise#strong-parameters
Devise preparó todo para eso:
En el controlador de usuarios tienes
private
# Never trust parameters from the scary internet, only allow the white list through.
def user_params
params.require(:user).permit(:full_name <add your parameter>)
end
El problema parece con los parámetros fuertes, mira aquí y copia el código.
Copie ese archivo en la misma ubicación en su app/controllers/devise/registrations_controller.rb
proyecto app/controllers/devise/registrations_controller.rb
y cambiar el código de la acción crear.
# POST /resource
def create
# THIS LINE IS THE ONE YOU CHANGE
self.resource = build_resource(sign_up_params.merge(:bio, :name))
if resource.save
if resource.active_for_authentication?
set_flash_message :notice, :signed_up if is_navigational_format?
sign_up(resource_name, resource)
respond_with resource, :location => after_sign_up_path_for(resource)
else
set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_navigational_format?
expire_session_data_after_sign_in!
respond_with resource, :location => after_inactive_sign_up_path_for(resource)
end
else
clean_up_passwords resource
respond_with resource
end
end
Debo decirles que no estoy muy seguro de si esto funciona porque no uso un dispositivo, pero al ver el código parece que funcionará.
La solución aceptada es suficientemente buena, pero veo dos problemas: 1) Todos los controladores verificarán si el controlador actual es el controlador de if: :devise_controller?
( if: :devise_controller?
) Y 2) Necesitamos escribir todos los parámetros aceptables en el método ( ...for(:sign_up) {|u| u.permit(:bio, :name)}
), incluso el :email
...for(:sign_up) {|u| u.permit(:bio, :name)}
:password
y así sucesivamente.
Creo que una solución más elegante podría ser:
# app/controllers/users/registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
before_filter :configure_permitted_parameters
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up).push(:name, :phone, :organization)
end
end
# config/routes.rb
devise_for :users, :controllers => { :registrations => "users/registrations" }
NOTA: Actualizaciones para Rails 4.2+
Esta respuesta está desactualizada:
- Cambie "usuarios" a "usuario" en la ruta "usuarios / registro" para Rails 4.2.1 y Devise 3.4.1.
-
devise_parameter_sanitizer.permit()
reemplaza adevise_parameter_sanitizer.for()
para Devise 4 (vea Rails 5, Método indefinido `para ''para # <Diseño en línea devise_parameter_sanitizer.for )
Tanto para sign_up como para account_update, haga esto para controllers/applcation_controller.rb
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
before_action :authenticate_user!
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:password, :password_confirmation,:current_password,:email,:name, :phonenumber,:province,:city,:area,:idcardimg,:role) }
devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:password, :password_confirmation,:current_password,:email,:name, :phonenumber,:province,:city,:area,:idcardimg,:role) }
end
end
Yo también estaba teniendo problemas con esto. La documentación en el sitio de devise ayudó así como algunos foros. Esto es lo que terminé haciendo:
En el RegistrationsController personalizado (app / controllers / users / registrations_controller.rb)
# app/controllers/users/registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
before_filter :update_sanitized_params, if: :devise_controller?
def update_sanitized_params
devise_parameter_sanitizer.for(:sign_up) {|u| u.permit(:name, :email, :password, :password_confirmation)}
end
end
Luego, en su archivo de ruta (config / route.rb), utilice esto para su declaración devise_for:
devise_for :users, controllers: {registrations: "users/registrations"}