Rails 5, # <Devise on line devise_parameter_sanitizer.for에 대한 정의되지 않은 메소드`for '


95

Rails 5를 사용하고 있습니다.

모델 사용자에 새 필드 사용자 이름을 추가했습니다.

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

등록하는 동안 오류가 표시됩니다 : 정의되지 않은 방법 'for'for # 의미 했습니까? 포크

자취:

NoMethodError (# Fork에 대한 정의되지 않은 메소드 'for') :

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)

누가 도울 수 있습니까? 이 문제를 어떻게 해결합니까?


1
Rails 4.2에서도 발생합니다.
sekrett

답변:


173

According to the documentation:

Devise 4에서 Parameter Sanitaizer API가 변경되었습니다.

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

어떤 이유로 이것은 작동하지만 레일을 다시 시작하면 다시 작동하지 않습니다
K2xL

@ K2xL 휴지통을 비우시겠습니까? 죄송합니다. 10 월입니다. 어떻게 고쳤나요?
snowYetis

중지 + 다시 시작 봄, pehaps
phillyslick

1
감사! 코드를 업데이트하고 싶지 않은 사람들은 Gemfile을 적절하게 조정할 수 있습니다 gem 'devise', '~> 3'.
Darragh Enright

34

방금 변경하는 경우 .for.permit그것은뿐만 아니라 작동합니다. 예를 들면 :

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

Rails 4.2.x와 Rails 5.0.x에서 모두 작동합니다.



0

컨트롤러의 configure_permitted_parameters 메서드에서 account_update를 놓친 것 같습니다. 고안 패턴을 따라야합니다. Devise에는 계정 업데이트 페이지가 있습니다. views / devise / registrations / edit.html.erb에서 찾을 수 있으며 코드는 sign_up 페이지에서도 작동하지 않습니다. 여기서 sign_up 페이지를 지정했습니다.

사용자 테이블을 업데이트하려면 사용자 / 편집에서 업데이트를 제출하는 순간 또는 sign_up 페이지에서 사용자 이름을 제출하는 경우이 고안 패턴을 따라 데이터베이스 사용자 테이블을 업데이트해야합니다. 사용자 테이블에 새 열을 추가 한 경우에도 configure_permitted_parameters 메서드에 추가해야합니다. 귀하의 경우에는 사용자 이름이지만 account_update도 놓쳤습니다. 기본적으로 Devise 패턴을 따르지 않고 사용자 이름을 업데이트하거나 사용자 이름 필드에 문자열을 추가하고 싶다고 말합니다. User 테이블에 추가하는 모든 필드는이 Devise 패턴을 따라야합니다. 또한이 사용자 이름을 업데이트 할 수있는 페이지를 지정할 수 있습니다. 아래 예제에서는 devise 업데이트 페이지를 사용하고 있습니다. 앞서 말했듯이 사용자 테이블에 사용자 정의 필드 이름을 추가 한 경우에도이 패턴을 따라야합니다.

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

다음으로 user.rb에서 User 모델의 사용자 이름을 확인했는지 확인하십시오.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.