का उपयोग कर मेरी वसीयत उपयोगकर्ता वर्ग के लिए एक नेस्टेड कस्टम विशेषता है, प्रोफ़ाइल (एक 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
(जैसा कि मेरे मूल प्रश्न में देखा गया है) को अनुमति देता हूं?
पर और अधिक पढ़ें आप sign_up_params ओवरराइड करने के लिए इस कोड को कहाँ रखूँ? –
** डेविस :: रजिस्ट्रेशन कंट्रोलर ** से विरासत में प्राप्त कक्षा में, इस प्रकार आप इसे ओवरराइड/विस्तारित करते हैं –
हाँ, यह ऐसा करने का तरीका है ... हैश के लिए (मेरे 'profile_attributes' की तरह), आपको निर्दिष्ट करना होगा डिज़ाइन द्वारा स्पष्ट रूप से प्रत्येक एम्बेडेड विशेषता। यानी ऐसा कुछ दिखता है: 'params.require (: user) .permit (: ईमेल,: पासवर्ड,: password_confirmation, profile_attributes: [: first_name,: occupation_title]) ' –