7

का उपयोग कर मेरी वसीयत उपयोगकर्ता वर्ग के लिए एक नेस्टेड कस्टम विशेषता है, प्रोफ़ाइल (एक Mongoid दस्तावेज़), जोड़ने के लिए कोशिश कर रहा है। जब वसीयत पंजीकरण फार्म प्रस्तुत किया जाता है, यह दोनों एक उपयोगकर्ता और एक इसी प्रोफ़ाइल वस्तु के रूप में अच्छी तरह से बनाना चाहिए।रेल 4/वसीयत/MongoDB: "unpermitted पैरामीटर" कस्टम गुण और मजबूत मापदंडों

मैं अंत परिणाम चाहते हैं मेरी MongoDB में कुछ इस तरह देखने के लिए:

उपयोगकर्ता:

{ 
    # Devise fields: 
    "email": "[email protected]", 
    ... 
    # Custom field 
    "profile" : "<object_id>" 
} 

प्रोफाइल:

{ 
    "first_name": "Dave", 
    .... 
} 

दुर्भाग्य से, मैं रिसी हूँ जब भी मैं अपना पंजीकरण जमा करता हूं, यह मेरे कंसोल में इसे विंग करता है। यह सफलतापूर्वक उपयोगकर्ता बनाता है लेकिन एक संबंधित प्रोफ़ाइल बनाने में विफल रहता है।

Started POST "/" for 127.0.0.1 at 2013-04-20 23:37:10 -0400 
Processing by Users::RegistrationsController#create as HTML 
Parameters: 
    {"utf8"=>"✓", 
    "authenticity_token"=>"awN2GU8EYEfisU0", 
    "user"=> 
     {"profile_attributes"=> 
      {"first_name"=>"Dave", 
      "birthday(2i)"=>"4", 
      "birthday(3i)"=>"21", 
      "birthday(1i)"=>"1933", 
      "occupation_title"=>"Software Developer"}, 
     "password"=>"[FILTERED]", 
     "password_confirmation"=>"[FILTERED]", 
     "email"=>"[email protected]"}} 
Unpermitted parameters: profile_attributes 

मैं सेटअप:

  • रेल 4.0.0beta1, रूबी 2.0.0-p0
  • वसीयत ('rails4' शाखा), Mongoid (Git से)
  • मजबूत पैरामीटर के लिए परिभाषा जोड़ने के लिए एक कस्टम डेविस पंजीकरण नियंत्रक।

मॉडल/user.rb:

class User 
    include Mongoid::Document 

    devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable, 
    :token_authenticatable, :confirmable, :lockable, :timeoutable 

    field :email,    type: String, default: '' 

    ... 

    has_one :profile 
    accepts_nested_attributes_for :profile 
end 

मॉडल/profile.rb:

class Profile 
    include Mongoid::Document 
    include Mongoid::Timestamps 

    # Attributes 
    # ---------- 
    field :slug,    type: String, default: '' # Acts as user-'friendlier' slug 
    field :birthday,   type: DateTime, default: DateTime.now 
    field :first_name,   type: String, default: '' 
    field :occupation_title, type: String, default: '' 

    belongs_to :user 
    embeds_many :photos 
    has_one :occupation_industry, :as => :industry 
end 

नियंत्रकों/उपयोगकर्ताओं/registrations_controller.rb

class Users::RegistrationsController < Devise::RegistrationsController 

    def resource_params 
    params.require(:user).permit(:email, :password, :password_confirmation, :profile_attributes) 
    end 
    private :resource_params 
end 

routes.rb

devise_for :users, 
       :path => '', 
       :path_names => { 
       :sign_in => 'login', 
       :sign_out => 'logout', 
       :sign_up => 'register' 
       }, 
       :controllers => { 
       :registrations => "users/registrations", 
       :passwords => "users/passwords" 
       } 

मैं पहले से ही इन संबंधित पोस्ट पर ध्यान दिया है, वे मदद करने के लिए नहीं लगता था:


संपादित करें: जैसे वसीयत वास्तव में अपनी 'rails4' शाखा में मजबूत मानकों (जो कुछ ही दिनों में मास्टर में मर्ज करने के लिए माना जाता है का समर्थन करता है

लग रहा है।) कोड के माध्यम से देखकर, ऐसा प्रतीत होता है कि आप डिवाइसेज नियंत्रकों पर प्रत्येक क्रिया के लिए पैराम फ़ंक्शन ओवरराइड कर सकते हैं। नए उपयोगकर्ताओं को बनाने के लिए, मेरे उदाहरण में resource_params के बजाय sign_up_params

def sign_up_params 
    params.require(:user).permit! 
end 

जाहिर है, हार के इस प्रकार मजबूत करने के उद्देश्य:

उचित एक को यह नाम बदलने के बावजूद, यह अभी भी काम नहीं किया ... केवल इस धमाके का उपयोग कर सभी मापदंडों श्वेत सूची बनाती काम करने के लिए लग रहा था पैरामीटर ... तो अब सवाल यह है कि मैं अपने नेस्टेड विशेषताओं को profile_attributes (जैसा कि मेरे मूल प्रश्न में देखा गया है) को अनुमति देता हूं?

उत्तर

11

मैं ठीक उसी मुद्दे और अधिभावी sign_up_params था किया उसके लिये मुझे

def sign_up_params 
    params.require(:user).permit(:email, :password, :password_confirmation, :other, :etc) 
end 
निश्चित रूप से

काम करते हैं, अंतर यह है कि मेरा में है, बस अदिश मूल्यों कर रहे हैं आप एक रिश्ता आवंटित बड़े पैमाने पर करने के लिए कोशिश कर रहे हैं, जबकि ... मुझे लगता है कि वह जगह है जहां आपको देखना चाहिए।

वैसे, दस्तावेज अभी भी इस विषय में बहुत ही अचूक है (बहुत नया), और कोड कमेंट्स devise_parameter_sanitizer को ओवरराइड करने का सुझाव देते हैं, जो आवश्यक नहीं है।

+2

पर और अधिक पढ़ें आप sign_up_params ओवरराइड करने के लिए इस कोड को कहाँ रखूँ? –

+0

** डेविस :: रजिस्ट्रेशन कंट्रोलर ** से विरासत में प्राप्त कक्षा में, इस प्रकार आप इसे ओवरराइड/विस्तारित करते हैं –

+3

हाँ, यह ऐसा करने का तरीका है ... हैश के लिए (मेरे 'profile_attributes' की तरह), आपको निर्दिष्ट करना होगा डिज़ाइन द्वारा स्पष्ट रूप से प्रत्येक एम्बेडेड विशेषता। यानी ऐसा कुछ दिखता है: 'params.require (: user) .permit (: ईमेल,: पासवर्ड,: password_confirmation, profile_attributes: [: first_name,: occupation_title]) ' –

1

मैंने आपके कोड का उपयोग किया और यह मेरे लिए काम किया! Unpermitted parameters: password, remember_me:

यहाँ है कि मैं क्या

class RegistrationsController < Devise::RegistrationsController 
    skip_before_filter :verify_authenticity_token, :only => :create #, :if => Proc.new { |c| c.request.format == 'application/json' } 
    respond_to :json, :html, :xml 

    def create 
    user = User.new(devise_registrations_permitted_parameters) 
    if user.save 
     render :json=> user.as_json(:auth_token=>user.authentication_token, :email=>user.email,:name => user.name), :status=>201 
     return 
    else 
     warden.custom_failure! 
     render :json=> user.errors, :status=>422 
    end 
    end 


    protected                
    def devise_registrations_permitted_parameters 
     params.require(:user).permit(:name, :email, :password, :password_confirmation) 
    end 

end 
2

किया मैं एक ही मुद्दा था तो प्रवेश, यह कहते है। और क्योंकि मेरे पास कोई नियंत्रक है जो विरासत :: सत्र नियंत्रक है, इसलिए मैं अपने parameter sanitizer का उपयोग करता हूं। मेरी hzsapa_parameter_sanitizer.rb और config/application.rb में आवश्यक है, तो में devise_parameter_sanitizer विधि ओवरराइड है

में एक फ़ाइल बनाएँ '{} Rails.root #/lib' तह,:

यहाँ मैं क्या कर रहा है application_controller.rb

lib/hzsapa_parameter_sanitizer.rb

class HzsapaParameterSanitizer < Devise::ParameterSanitizer 
    def sign_in 
    default_params.permit(auth_keys + [:password, :remember_me]) 
    end 
end 

आप उन विधि ओवरराइड कर सकते हैं आपकी समस्या पर निर्भर करता है:

def sign_in 
    default_params.permit(auth_keys) 
end 

def sign_up 
    default_params.permit(auth_keys + [:password, :password_confirmation]) 
end 

def account_update 
    default_params.permit(auth_keys + [:password, :password_confirmation, :current_password]) 
end 

config/application.rb

require "hzsapa_parameter_sanitizer" 

एप्लिकेशन/application_controller.rb

class ApplicationController < ActionController::Base 
    # Prevent CSRF attacks by raising an exception. 
    # For APIs, you may want to use :null_session instead. 
    protect_from_forgery with: :exception 

    def devise_parameter_sanitizer 
    @devise_parameter_sanitizer ||= if defined?(ActionController::StrongParameters) 
             HzsapaParameterSanitizer.new(resource_class, resource_name, params) 
            else 
             Devise::BaseSanitizer.new(resource_class, resource_name, params) 
            end 
    end 
end 

संपादित करें: मुझे बस तैयार रीडमे में समाधान मिला, आप सी इसका पालन करें here

4

मुझे एक अलग विधि मिली जो सभी डिवाइसेज ओवरराइडिंग तर्क और कोड को एप्लिकेशन नियंत्रक में रहने के लिए अनुमति देता है।यह प्रत्येक तैयार कार्रवाई (साइन इन, साइन अप, अपडेट) के लिए किसी भी और सभी कस्टम पैरा को पारित करने की अनुमति देता है। मैं devise_invitable के लिए एक पैरामीटर sanitizer भी जोड़ता हूं और उस तर्क को यहां संभालता हूं (आमंत्रण, accept_invitation)। मैं अवतार की तरह कस्टम पैरामीटर, avatar_cache, आदि मिल गया है:

#application_controller.rb 

    before_filter :configure_permitted_parameters, if: :devise_controller? 

protected 
    # There are just three actions in Devise that allows any set of parameters to be passed down to the model, 
    # therefore requiring sanitization. Their names and the permited parameters by default are: 

    # sign_in (Devise::SessionsController#new) - Permits only the authentication keys (like email) 
    # sign_up (Devise::RegistrationsController#create) - Permits authentication keys plus password and password_confirmation 
    # account_update (Devise::RegistrationsController#update) - Permits authentication keys plus password, password_confirmation 
    # and current_password. More at https://github.com/plataformatec/devise#strong-parameters 

    def configure_permitted_parameters 
    devise_parameter_sanitizer.for(:accept_invitation) do |u| 
     u.permit(:username,:validate_username, :password,:password_confirmation, :invitation_token) 
    end 
    devise_parameter_sanitizer.for(:invite) do |u| 
     u.permit(:name,:comments) 
    end 

    devise_parameter_sanitizer.for(:sign_up) do |u| 
     u.permit(:username,:password,:password_confirmation) 
    end 
    devise_parameter_sanitizer.for(:sign_in) do |u| 
     u.permit(:username,:email,:password,:password_confirmation,:phone, :validate_username, :avatar_cache, :remove_avatar, :current_password,:remember_me) 
    end 

    devise_parameter_sanitizer.for(:account_update) do |u| 
     u.permit(:username,:email,:password,:password_confirmation,:phone, :validate_username,:avatar, :avatar_cache, :remove_avatar, :current_password) 
    end 
    end 

ढूँढें और https://github.com/plataformatec/devise#strong-parameters

संबंधित मुद्दे