Rails 5, Método indefinido `for 'para # <Diseñar en línea devise_parameter_sanitizer.for

95

Estoy trabajando con Rails 5

Agregué un nuevo nombre de usuario de campo en el modelo Usuario.

class Users::RegistrationsController < Devise::RegistrationsController
  before_action :configure_permitted_parameters

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up).push(:username)  
  end
end

Durante el registro se muestra el error: método indefinido `para 'para # ¿Quiso decir? tenedor

Rastro:

NoMethodError (método indefinido `para 'para # ¿Quiso decir? Fork):

app/controllers/users/registrations_controller.rb:7:in `configure_permitted_parameters'
  Rendering /usr/local/rvm/gems/ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout
  Rendering /usr/local/rvm/gems/ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/_source.html.erb
  Rendered /usr/local/rvm/gems/ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/_source.html.erb (5.0ms)
  Rendering /usr/local/rvm/gems/ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb
  Rendered /usr/local/rvm/gems/ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (2.9ms)
  Rendering /usr/local/rvm/gems/ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb
  Rendered /usr/local/rvm/gems/ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (1.2ms)
  Rendered /usr/local/rvm/gems/ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout (118.1ms)

¿Quién puede ayudar? ¿Cómo solucionar este problema?

Dmitriy
fuente
1
También ocurre en Rails 4.2.
sekrett

Respuestas:

173

According to the documentation:

La API de desinfectante de parámetros ha cambiado para Devise 4

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

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
  end
end
Зелёный
fuente
por alguna razón, esto funciona, pero cuando reinicio los rieles, deja de funcionar nuevamente
K2xL
@ K2xL ¿Vaciar su papelera? Vaya, es octubre. ¿Cómo arreglaste esto?
snowYetis
detener + reiniciar primavera, tal vez
phillyslick
1
¡Gracias! Para aquellos que no quieran actualizar su código, simplemente pueden ajustar su Gemfile en consecuencia, lo ordenaron gem 'devise', '~> 3'por mí.
Darragh Enright
34

Si simplemente cambia .fora, .permittambién funciona. Por ejemplo:

devise_parameter_sanitizer.permit(:sign_up) { |u| u.permit({ roles: [] }, :email, :password, :password_confirmation, :username) }

Funciona tanto en Rails 4.2.xy Rails 5.0.x

Brandy Burdick
fuente
2

No olvides devise_parameter_sanitizer.permit(:account_update, keys: [:username])

Dmitry Polyakovsky
fuente
1
No lo olvidó, necesita cambiar a una nueva sintaxis.
sekrett
0

Creo que se perdió account_update en el método configure_permitted_parameters de su controlador, debe seguir el patrón de diseño. Devise tiene una página de actualización de cuenta. Puede encontrar esto en views / devise / registrations / edit.html.erb, y su código tampoco funcionará en la página de registro, aquí especificó la página de registro

Para actualizar su tabla de usuarios, en el momento en que envía una actualización en sus usuarios / editar, o si está enviando un nombre de usuario en la página de registro, debe seguir este patrón de diseño para actualizar la tabla de usuarios de la base de datos. Incluso si agregó una nueva columna a la tabla de usuarios, tendría que agregarla al método configure_permitted_parameters. En su caso, es el nombre de usuario, pero también se perdió account_update. Básicamente, está diciendo que desea actualizar el nombre de usuario o agregar la cadena al campo de nombre de usuario sin seguir el patrón de Devise. Cualquier campo que agregue a la tabla de usuario debe seguir este patrón de dispositivo. También puede especificar qué página tiene permiso para actualizar este nombre de usuario. En mi ejemplo a continuación, estoy usando la página de actualización del dispositivo. Entonces, como dije, incluso si agregó un nombre de campo personalizado a la tabla Usuarios, debe seguir este patrón.

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

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
    devise_parameter_sanitizer.permit(:account_update, keys: [:username])
  end
end

A continuación, asegúrese de que en su user.rb haya validado el nombre de usuario en su modelo de usuario.

class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  validates :username, presence: true
end
Elias Glyptis
fuente
-1
class ApplicationController < ActionController::Base

  before_action :configure_permitted_paramters, if: :devise_controller?

  protected
    def configure_permitted_paramters

        devise_parameter_sanitizer.permit(:sign_up, keys: [:fullname])

        devise_parameter_sanitizer.permit(:account_update, keys: [:fullname, 
        :phone_number, :description, :email, :password])

    end

end
Elias Glyptis
fuente