Rails 5, Metode tak terdefinisi `untuk 'untuk # <Rancang on line devise_parameter_sanitizer.for

95

Saya bekerja dengan Rails 5

Saya menambahkan nama pengguna bidang baru dalam model Pengguna.

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

Selama registrasi ditampilkan kesalahan: metode tidak ditentukan `untuk 'untuk # Maksud Anda? garpu

Jejak:

NoMethodError (metode tidak ditentukan `untuk 'untuk # Maksud Anda? Garpu):

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)

Siapa yang bisa membantu? Bagaimana mengatasi masalah ini?

Dmitriy
sumber
1
Ini juga terjadi di Rails 4.2.
sekrett

Jawaban:

173

According to the documentation:

API Parameter Sanitaizer telah berubah untuk Rancangan 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
Зелёный
sumber
untuk beberapa alasan ini bekerja tetapi ketika saya me-restart rel berhenti bekerja lagi
K2xL
@ K2xL Kosongkan tempat sampah Anda? Ups, ini bulan Oktober. Bagaimana Anda memperbaikinya?
snowYetis
stop + restart musim semi, pehaps
phillyslick
1
Terima kasih! Bagi mereka yang tidak ingin memperbarui kode mereka, Anda dapat menyesuaikan Gemfile Anda sesuai dengan itu - gem 'devise', '~> 3'mengurutkannya untuk saya.
Darragh Enright
34

Jika Anda hanya mengubahnya .formenjadi .permitberfungsi juga. Sebagai contoh:

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

Ia bekerja di Rails 4.2.x dan Rails 5.0.x

Brandy Burdick
sumber
2

Jangan lupa devise_parameter_sanitizer.permit(:account_update, keys: [:username])

Dmitry Polyakovsky
sumber
1
Dia tidak lupa, dia perlu beralih ke sintaks baru.
sekrett
0

Saya pikir Anda melewatkan account_update dalam metode konfigurasi_permitted_parameters pengontrol Anda, Anda harus mengikuti pola rancangan. Devise memiliki halaman pembaruan akun. Anda dapat menemukannya di views / devise / registrations / edit.html.erb, dan kode Anda juga tidak akan berfungsi di halaman sign_up, di sini Anda menentukan halaman sign_up

Untuk memperbarui tabel pengguna Anda, begitu Anda mengirimkan pembaruan di pengguna / edit Anda, atau jika Anda mengirimkan nama pengguna di halaman sign_up, Anda harus mengikuti pola rancangan ini, untuk memperbarui tabel pengguna database. Meskipun Anda menambahkan kolom baru ke tabel pengguna, Anda harus menambahkannya ke metode configure_permitted_parameters. Dalam kasus Anda itu adalah nama pengguna, tetapi Anda juga melewatkan pembaruan_akun. Pada dasarnya Anda mengatakan bahwa Anda ingin memperbarui nama pengguna atau menambahkan string ke bidang nama pengguna tanpa mengikuti pola Rancangan. Setiap bidang yang Anda tambahkan ke tabel Pengguna harus mengikuti pola Rancangan ini. Anda juga dapat menentukan halaman mana yang diizinkan untuk memperbarui nama pengguna ini. Dalam contoh saya di bawah ini, saya menggunakan halaman pembaruan perangkat. Jadi seperti yang saya katakan, meskipun Anda menambahkan nama bidang khusus ke tabel Pengguna, Anda harus mengikuti pola ini.

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

Selanjutnya pastikan di user.rb Anda memiliki nama pengguna yang valid di model Pengguna Anda.

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

  validates :username, presence: true
end
Elias Glyptis
sumber
-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
sumber