Rails 5, Undefined method `for 'for # <Devise on line devise_parameter_sanitizer.for

95

Pracuję z Railsami 5

Dodałem nową nazwę użytkownika pola w modelu User.

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

Podczas rejestracji wyświetlany jest błąd: nieokreślona metoda `dla 'dla # Czy chodziło Ci o? widelec

Ślad:

NoMethodError (nieokreślona metoda `for 'for # Did you mean? 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)

Kto może pomóc? Jak rozwiązać ten problem?

Dmitriy
źródło
1
Dzieje się tak również na Railsach 4.2.
sekrett

Odpowiedzi:

174

According to the documentation:

Interfejs API Parameter Sanitaizer został zmieniony w 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
Зелёный
źródło
z jakiegoś powodu to działa, ale kiedy restartuję szyny, przestaje działać
K2xL
@ K2xL Wyczyścić kosz? Ups, jest październik. Jak to naprawiłeś?
snowYetis
stop + restart wiosna, pehaps
phillyslick
1
Dzięki! Dla tych, którzy nie chcą aktualizować swojego kodu, możesz po prostu odpowiednio dostosować swój plik Gemfile - gem 'devise', '~> 3'posortować go dla mnie.
Darragh Enright
34

Jeśli po prostu zmienić .forna .permitnim działa jak dobrze. Na przykład:

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

Działa w obu Railsach 4.2.x i Rails 5.0.x

Brandy Burdick
źródło
2

Nie zapomnij devise_parameter_sanitizer.permit(:account_update, keys: [:username])

Dmitry Polyakovsky
źródło
1
Nie zapomniał, musi przejść na nową składnię.
sekrett
0

Myślę, że przegapiłeś account_update w metodzie configure_permitted_parameters twojego kontrolera, musisz postępować zgodnie ze wzorcem konstrukcyjnym. Devise ma stronę aktualizacji konta. Możesz to znaleźć w views / devise / registrations / edit.html.erb, a Twój kod również nie będzie działał na stronie sign_up, tutaj określono stronę sign_up

Aby zaktualizować tabelę użytkowników, w chwili, gdy prześlesz aktualizację w swoich użytkownikach / edytuj lub jeśli podasz nazwę użytkownika na stronie rejestracji, musisz postępować zgodnie z tym wzorcem, aby zaktualizować tabelę użytkowników bazy danych. Nawet jeśli dodałeś nową kolumnę do tabeli użytkowników, musisz dodać ją do metody configure_permitted_parameters. W twoim przypadku jest to nazwa użytkownika, ale przegapiłeś również account_update. Zasadniczo mówisz, że chcesz zaktualizować nazwę użytkownika lub dodać ciąg do pola nazwy użytkownika bez podążania za wzorcem Devise. Każde pole dodane do tabeli User powinno być zgodne z tym wzorcem Devise. Możesz również określić, która strona może aktualizować tę nazwę użytkownika. W moim przykładzie poniżej używam strony aktualizacji devise. Tak jak powiedziałem, nawet jeśli dodałeś niestandardową nazwę pola do tabeli Users, musisz postępować zgodnie z tym wzorcem.

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

Następnie upewnij się, że w swoim user.rb masz poprawną nazwę użytkownika w swoim modelu użytkownika.

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

  validates :username, presence: true
end
Elias Glyptis
źródło
-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
źródło