Rails 5, # için 'için' tanımlanmamış yöntem <Devise on line devise_parameter_sanitizer.for


95

Rails 5 ile çalışıyorum

Kullanıcı modelinde yeni alan kullanıcı adı ekledim.

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

Kayıt sırasında görüntüleniyor hata: 'için' için tanımsız yöntemi # Bunu mu demek istediniz? çatal

İz:

NoMethodError ("for 'for' for # Bunu mu demek istediniz? 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)

Kim yardım edebilir? Bu problem nasıl çözülür?


1
Rails 4.2'de de olur.
sekrett

Yanıtlar:


175

According to the documentation:

Devise 4 için Parametre Sanitaizer API değiştirildi

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

Bazı nedenlerden dolayı bu işe yarıyor, ancak rayları yeniden
başlattığımda

@ K2xL Kutunuzu temizlensin mi? Oops, Ekim. Bunu nasıl düzelttin?
snowYetis

stop + restart spring,
pehaps

1
Teşekkürler! Kodlarını güncellemek istemeyenler için, Gemfile'ınızı buna göre ayarlayabilir - gem 'devise', '~> 3'benim için sıralayabilirsiniz .
Darragh Enright

34

Sadece değiştirirseniz .foriçin .permitbunun iyi çalışır. Örneğin:

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

Hem Rails 4.2.x hem de Rails 5.0.x'te çalışır



0

Denetleyicinizin configure_perlied_parameters yönteminde account_update'i kaçırdığınızı düşünüyorum, tasarlama modelini izlemeniz gerekiyor. Devise'ın bir hesap güncelleme sayfası var. Bunu views / devise / registrations / edit.html.erb'de bulabilirsiniz ve kodunuz ayrıca kayıt sayfasında da çalışmayacaktır, burada kayıt sayfasını belirttiniz

Kullanıcı tablonuzu güncellemek için, kullanıcılarınızda / düzenlemenizde bir güncelleme gönderdiğiniz dakika veya kaydolma sayfasında bir kullanıcı adı gönderiyorsanız, veritabanı Kullanıcı tablosunu güncellemek için bu tasarım modelini izlemeniz gerekir. Kullanıcı tablosuna yeni bir sütun ekleseniz bile, bunu configure_perlied_parameters yöntemine eklemeniz gerekir. Sizin durumunuzda bu kullanıcı adıdır, ancak account_update'i de kaçırdınız. Temel olarak, Devise modelini takip etmeden kullanıcı adını güncellemek veya dizeyi kullanıcı adı alanına eklemek istediğinizi söylüyorsunuz. Kullanıcı tablosuna eklediğiniz herhangi bir alan bu Geliştirme modelini izlemelidir. Ayrıca bu kullanıcı adını hangi sayfanın güncellemesine izin verildiğini de belirtebilirsiniz. Aşağıdaki örneğimde, geliştirme güncelleme sayfasını kullanıyorum. Dediğim gibi, Kullanıcılar tablosuna özel bir alan adı ekleseniz bile bu kalıbı izlemeniz gerekir.

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

Daha sonra user.rb'de Kullanıcı modelinizdeki kullanıcı adını doğruladığınızdan emin olun.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.