Rails 5 วิธีที่ไม่ได้กำหนด `สำหรับ 'สำหรับ # <ประดิษฐ์ในบรรทัด devise_parameter_sanitizer.for


95

ฉันกำลังทำงานกับ Rails 5

ฉันเพิ่มชื่อผู้ใช้ฟิลด์ใหม่ในรุ่น 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

ในระหว่างการลงทะเบียนแสดงข้อผิดพลาด: ไม่ได้กำหนดวิธีการ `สำหรับ 'สำหรับ # คุณหมายถึง? ส้อม

ติดตาม:

NoMethodError (วิธีที่ไม่ได้กำหนด `สำหรับ 'สำหรับ # คุณหมายถึง? 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)

ใครสามารถช่วย? วิธีแก้ปัญหานี้?


1
มันเกิดขึ้นบน Rails 4.2 ด้วย
sekrett

คำตอบ:


176

According to the documentation:

Parameter Sanitaizer API มีการเปลี่ยนแปลงสำหรับ 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

ด้วยเหตุผลบางอย่างมันใช้งานได้ แต่เมื่อฉันรีสตาร์ทรางมันจะหยุดทำงานอีกครั้ง
K2xL

@ K2xL ล้างถังขยะไหม อ๊ะเดือนตุลาคม คุณแก้ไขปัญหานี้อย่างไร
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

ฉันคิดว่าคุณพลาด account_update ในเมธอด config_permitted_parameters ของคอนโทรลเลอร์คุณต้องทำตามรูปแบบประดิษฐ์ Devise มีหน้าอัปเดตบัญชี คุณสามารถค้นหาสิ่งนี้ได้ใน views / devise / registrations / edit.html.erb และโค้ดของคุณจะไม่ทำงานในหน้า sign_up ซึ่งคุณได้ระบุหน้า sign_up ไว้ที่นี่

ในการอัปเดตตารางผู้ใช้ของคุณนาทีที่คุณส่งการอัปเดตในผู้ใช้ / แก้ไขของคุณหรือหากคุณกำลังส่งชื่อผู้ใช้ในหน้า sign_up คุณต้องทำตามรูปแบบการประดิษฐ์นี้เพื่ออัปเดตตารางฐานข้อมูลผู้ใช้ แม้ว่าคุณจะเพิ่มคอลัมน์ใหม่ลงในตารางผู้ใช้คุณจะต้องเพิ่มคอลัมน์ลงในเมธอด config_permitted_parameters ในกรณีของคุณเป็นชื่อผู้ใช้ แต่คุณพลาด account_update เช่นกัน โดยพื้นฐานแล้วคุณกำลังบอกว่าคุณต้องการอัปเดตชื่อผู้ใช้หรือเพิ่มสตริงลงในฟิลด์ชื่อผู้ใช้โดยไม่ต้องทำตามรูปแบบ 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 ของคุณคุณได้ตรวจสอบชื่อผู้ใช้ในรูปแบบผู้ใช้ของคุณแล้ว

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.