Rails 5, metodo non definito `for 'for # <Devise on line devise_parameter_sanitizer.for


95

Sto lavorando con Rails 5

Ho aggiunto un nuovo nome utente del campo nel modello Utente.

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 la registrazione viene visualizzato l'errore: metodo non definito `per 'per # Intendevi? forchetta

Traccia:

NoMethodError (metodo non definito `per 'per # Intendevi? 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)

Chi può aiutare? Come risolvere questo problema?


1
Succede anche su Rails 4.2.
sekrett

Risposte:


173

According to the documentation:

L'API Parameter Sanitaizer è cambiata per 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

per qualche motivo funziona, ma quando riavvio rails smette di funzionare di nuovo
K2xL

@ K2xL Cancella il cestino? Ops, è ottobre. Come hai risolto questo problema?
neve Yetis

stop + riavvio primavera, forse
phillyslick

1
Grazie! Per coloro che non vogliono aggiornare il loro codice, puoi semplicemente regolare il tuo Gemfile di conseguenza, ordinandolo gem 'devise', '~> 3'per me.
Darragh Enright

34

Se basta cambiare l' .forad .permitfunziona pure. Per esempio:

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

Funziona sia con Rails 4.2.x che con Rails 5.0.x.


2

Non dimenticare devise_parameter_sanitizer.permit(:account_update, keys: [:username])


1
Non ha dimenticato, ha bisogno di passare a una nuova sintassi.
sekrett

0

Penso che tu abbia perso account_update nel metodo configure_permitted_parameters del tuo controller, devi seguire lo schema devise. Devise ha una pagina di aggiornamento dell'account. Puoi trovarlo in views / devise / registrations / edit.html.erb, e anche il tuo codice non funzionerà nella pagina di registrazione, qui hai specificato la pagina di registrazione

Per aggiornare la tua tabella utente, nel momento in cui invii un aggiornamento nella tua lista utenti / modifica, o se stai inviando un nome utente nella pagina di registrazione, devi seguire questo modello di ideazione, per aggiornare la tabella Utente del database. Anche se hai aggiunto una nuova colonna alla tabella utente, dovresti aggiungerla al metodo configure_permitted_parameters. Nel tuo caso è username, ma ti sei perso anche account_update. In pratica stai dicendo che vuoi aggiornare il nome utente o aggiungere la stringa al campo nome utente senza seguire lo schema Devise. Qualsiasi campo che aggiungi alla tabella Utente dovrebbe seguire questo modello Devise. Inoltre è possibile specificare quale pagina è autorizzata ad aggiornare questo nome utente. Nel mio esempio qui sotto, sto usando la pagina di aggiornamento di devise. Quindi, come ho detto, anche se hai aggiunto un nome di campo personalizzato alla tabella Utenti, devi seguire questo schema.

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

Quindi assicurati di aver convalidato il nome utente nel tuo modello utente nel tuo user.rb.

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

  validates :username, presence: true
end

-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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.