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?
ruby-on-rails
devise
ruby-on-rails-5
Dmitriy
źródło
źródło
Odpowiedzi:
According to the documentation:
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
gem 'devise', '~> 3'
posortować go dla mnie.Jeśli po prostu zmienić
.for
na.permit
nim 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
źródło
Nie zapomnij
devise_parameter_sanitizer.permit(:account_update, keys: [:username])
źródło
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
źródło
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
źródło