रेल्स 5, अनिर्धारित विधि `के लिए 'के लिए # <लाइन पर devise_parameter_sanitizer.for


95

मैं रेल्स 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

पंजीकरण के दौरान त्रुटि प्रदर्शित की जाती है: # के लिए 'के लिए अपरिभाषित विधि' क्या आपका मतलब है? कांटा

ट्रेस:

NoMethodError (अपरिभाषित विधि `के लिए '# के लिए # क्या आपका मतलब? कांटा)?

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
यह रेल्स 4.2 पर भी होता है।
सीक्रेट

जवाबों:


173

According to the documentation:

डेमीज़ 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 अपना बिन साफ़ करें? उफ़, इसका अक्टूबर। आपने इसे कैसे ठीक किया?
हिमायतीस

स्टॉप + रिस्टार्ट स्प्रिंग,
पेप्स

1
धन्यवाद! उन लोगों के लिए जो अपने कोड को अपडेट नहीं करना चाहते हैं, आप केवल अपने जेमफाइल को उसी के अनुसार समायोजित कर सकते हैं - gem 'devise', '~> 3'मेरे लिए इसे क्रमबद्ध किया।
दरगाह

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 को याद किया, आपको डेविस पैटर्न का पालन करने की आवश्यकता है। Devise का खाता अपडेट पृष्ठ है। आप इसे व्यू / डेविस / रजिस्ट्रेशन / एडिट.html.html में देख सकते हैं, और आपका कोड साइन_अप पेज में भी काम नहीं करने वाला है, यहाँ आपने साइन_अप पेज निर्दिष्ट किया है

अपनी उपयोगकर्ता तालिका को अपडेट करने के लिए, वह मिनट जिसे आप अपने उपयोगकर्ताओं / संपादन में अपडेट सबमिट करते हैं, या यदि आप साइन-अप पृष्ठ में एक उपयोगकर्ता नाम प्रस्तुत कर रहे हैं, तो आपको डेटाबेस उपयोगकर्ता तालिका को अपडेट करने के लिए इस डैविस पैटर्न का पालन करना होगा। यहां तक ​​कि अगर आपने उपयोगकर्ता तालिका में एक नया कॉलम जोड़ा है, तो भी आपको इसे config_permitted_parameters विधि में जोड़ना होगा। आपके मामले में यह उपयोगकर्ता नाम है, लेकिन आपने account_update को भी याद किया है। आप मूल रूप से कह रहे हैं कि आप उपयोगकर्ता नाम अपडेट करना चाहते हैं या डेविस पैटर्न का पालन किए बिना उपयोगकर्ता नाम फ़ील्ड में स्ट्रिंग जोड़ना चाहते हैं। उपयोगकर्ता तालिका में आपके द्वारा जोड़ा गया कोई भी क्षेत्र इस डेविस पैटर्न का पालन करना चाहिए। साथ ही आप यह भी निर्दिष्ट कर सकते हैं कि इस उपयोगकर्ता नाम को अपडेट करने के लिए किस पृष्ठ की अनुमति है। नीचे मेरे उदाहरण में, मैं डेविस अपडेट पेज का उपयोग कर रहा हूं। तो जैसे मैंने कहा, भले ही आपने उपयोगकर्ता तालिका में एक कस्टम फ़ील्ड नाम जोड़ा हो, आपको इस पैटर्न का पालन करने की आवश्यकता है।

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.