2009-04-07 13 views
7

मैंने सोचा कि इसके लिए एक आसान समाधान होना चाहिए था, यह देखते हुए कि रेल 2.3 में इस नए घोंसले वाले रूपों की सुविधा है। असल में मैं उपयोगकर्ता को बनाना या अपडेट करना चाहता हूं और उन्हें एक ही समय में भूमिका निभाना चाहता हूं।नेस्टेड ऑब्जेक्ट w/चेकबॉक्स - accepts_nested_attributes_for के साथ भी बड़े पैमाने पर असाइनमेंट?

ऐसा लगता है कि मैं सब ठीक कर रहा हूं लेकिन मुझे त्रुटि मिलती है चेतावनी: इन संरक्षित विशेषताओं को बड़े पैमाने पर असाइन नहीं किया जा सकता: roles_attrributes

मैंने उपयोगकर्ता [permissions_attrributes] [role_id] को दृश्य बदलने की भी कोशिश की क्योंकि मैंने सोचा था कि शायद शामिल तालिका रेल को भ्रमित कर रही थी।

वैसे भी, यह वास्तव में कैसे काम करना चाहिए इस पर कोई सुझाव?

मॉडल

class User < ActiveRecord::Base 

    has_many :permissions 
    has_many :roles, :through => :permissions 

    accepts_nested_attributes_for :roles 
    accepts_nested_attributes_for :permissions 
end 

दृश्य से अंश (नोटिस मैंने कोशिश की और fields_for प्राप्त करने के लिए उत्पन्न करने के लिए क्या मैं यहाँ चाहते विफल रहा है, हो सकता है कि मेरी समस्या है?)

<% for role in Role.all %> 
<%= check_box_tag("user[roles_attrributes][id]",role.id) %> 
<%= role.rolename %> 
<br/> 
<% end %> 

पैरामीटर भर में आने वाले होने लगते हैं सही:

{"user"=>{"password_confirmation"=>"[FILTERED]", 
"roles_attrributes"=>{"id"=>"2"}, ... 

समाधान मेरा एक संयोजन गलत वर्तनी है, attr_accessible का उपयोग नहीं कर रहा है, अनुमतियों को एक्सेस करने की आवश्यकता है, और फॉर्म थोड़ा सा है।

मॉडल:

has_many :permissions, :dependent => :destroy 
has_many :roles, :through => :permissions 
accepts_nested_attributes_for :permissions 
attr_accessible :permissions_attributes 

दृश्य:

<% Role.all(:order => "rolename ASC").each_with_index do |role,idx| %> 
    <%= check_box_tag("user[permissions_attributes][#{idx}][role_id]",role.id) %> 
    <%= role.rolename %> 
    <br/> 
    <% end %> 

उत्तर

3

यह लग रहा है जैसे यह विशेषता अद्यतन करने के लिए के रूप में सुरक्षित नहीं चिह्नित है। आप को जोड़कर इसे ठीक करने के अपने मॉडल वर्ग के लिए निम्न सक्षम होना चाहिए:

attr_accessible :roles 

या संभवतः:

attr_accessible :roles_attributes 

यदि आप देखें, तो आप पहले से ही एक attr_accessible कॉल आप को यह भी जोड़ सकते हैं हो सकता है। अधिक जानकारी के लिए इस यहाँ प्रलेखित है:

http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M002226

+0

यह मेरी समझ थी कि accepts_nested_attributes_for की आवश्यकता नहीं थी। वैसे भी, मैंने दोनों की कोशिश की है और न ही काम किया है। – Bill

+0

वह त्रुटि संदेश निश्चित रूप से एक है जो एक attr_protected या attr_accessible समस्या के कारण होगा। इसके अलावा http://apidock.com/rails/ActiveRecord/NestedAttributes/ClassMethods/accepts_nested_attributes_for इंगित करता है कि एएनएएफ के साथ भी कुछ पता होना चाहिए। संभवतः एक करीब देखो लायक है? –

5

आप अपने में विशेषताओं की वर्तनी सही करते हैं, ऐसा लगता है कि यह काम करना चाहिए।

<% for role in Role.all %> 
<%= check_box_tag("user[roles_attributes][id]",role.id) %> 
<%= role.rolename %> 
<br/> 
<% end %> 
+0

अच्छा पकड़ो! यह समझाएगा कि विशेषता को अपरिचित क्यों किया गया था =) –