tutorial rails que ejemplos descargar curso caracteristicas ruby-on-rails ruby

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.

https://github.com/plataformatec/devise/blob/rails4/app/controllers/devise/registrations_controller.rb

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:


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"}