Programing

Rails 5, #에 대한 정의되지 않은 메소드`for '

crosscheck 2020. 9. 1. 07:03
반응형

Rails 5, #에 대한 정의되지 않은 메소드`for '

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)

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


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

방금 변경하는 경우 .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에서 모두 작동합니다.


잊지 마세요 devise_parameter_sanitizer.permit(:account_update, keys: [:username])


컨트롤러의 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

Next make sure in your user.rb you have validate username in your User model.

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

  validates :username, presence: true
end

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

참고URL : https://stackoverflow.com/questions/37341967/rails-5-undefined-method-for-for-devise-on-line-devise-parameter-sanitizer

반응형