2012-08-10 7 views
5

मैं एक ऐसा फॉर्म बनाने की कोशिश कर रहा हूं जो मुझे एक एसोसिएशन के लिए नए रिकॉर्ड जमा करने की अनुमति देता है जहां एसोसिएशन इनपुट समूहबद्ध होते हैं।समूह और फ़ील्ड_

class Product < AR::Base 
    has_many :properties 
    accepts_nested_attributes_for :properties 
    end 

ध्यान दें कि नियंत्रक में संपत्तियों की एक श्रृंखला के उत्पाद के लिए निर्माण कर रहे हैं, तो @product.properties.empty? # => false

नीचे fields_for मुझे product[properties_attributes][0][value] जैसे नामों के साथ सही इनपुट देता है।

= form.fields_for :properties do |pform|                                
    = pform.input :value 

लेकिन जैसे ही मैं कोशिश करते हैं और समूह संघ यह अब सही नाम के साथ आदानों उत्पन्न करता है के रूप में:

- @product.properties.group_by(&:group_name).each do |group_name, properties| 
    %h3= group_name              
    = form.fields_for properties do |pform|                                
    = pform.input :value 

यह आदानों जो name विशेषता product[product_property][value] तरह जबकि वास्तव में इस product[property_attributes][0][value] होना चाहिए बनाने पहले उदाहरण के अनुसार।

रेल प्रलेखन पता चलता है कि आप यह कर सकते हैं:

= form.fields_for :properties_attributes, properties do |pform| 

लेकिन यह एक त्रुटि "सरणी के लिए अपरिभाषित विधि मूल्य" देता है।

उत्तर

6

आप इस तरह की स्थापना की जरूरत है:

- @product.properties.group_by(&:group_name).each do |group_name, properties| 
    %h3= group_name 
    = form.fields_for :properties, properties do |pform| 
    = pform.text_field :value 

यह ठीक काम करना चाहिए, जब से तुम accepts_nested_attributes_for :properties रेल है पता है कि यह क्षेत्र बनाने चाहिए था properties_attributes के लिए। इसके अलावा,)

आप केवल एक प्रॉपर्टी आप उपयोग कर सकते हैं पर कुछ निर्णय आधार बनाना चाहते हैं तो, इसके अलावा अगर आप नवीनतम रेल में से एक का उपयोग कर रहे attr_accessible :properties_attributes जोड़ने के लिए और चाहते हो सकता है अगर आप अभी तक अपने मॉडल को नहीं जोड़ा है निम्नलिखित तरीके के साथ-:

- @product.properties.group_by(&:group_name).each do |group_name, properties| 
    %h3= group_name 
    - properties.each do |property| 
    = form.fields_for :properties, property do |pform| 
     = pform.text_field :value 

उन दोनों अच्छी तरह से वर्णन यहां: http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-fields_forOne-To-Many धारा

+0

यह काम करने के लिए लगता है, मैं क्यों मैं कोशिश नहीं की पता नहीं है ': properties' बजाय ': property_attributes'। जल्द ही स्वीकार करेंगे। – Kris

1

मुझे इस तरह की चीज़ों के लिए एक स्वच्छ 'रेल' समाधान की जानकारी नहीं है, लेकिन मैं अक्सर इन प्रकार की स्थितियों को अधिक मैन्युअल रूप से संभालता हूं। उदाहरण के लिए - समूहों के माध्यम से लूप और सशर्त रूप से केवल उन गुणों को दिखाएं जो किसी विशेष समूह में हैं।

class Product < AR::Base 
    has_many :properties 
    accepts_nested_attributes_for :properties 

    def group_names 
    properties.map(&:group_name).uniq.sort 
    end 
end 

ध्यान में रखते हुए

- for group_name in product.group_names 
    = form.fields_for :properties do |pform| 
    %h3= group_name 
    - if pform.object.group_name.eql?(group_name) 
     = pform.input :value 

इस के साथ एक छोटे से भूमि के ऊपर, बार बार उत्पाद से संपत्तियों की सूची प्राप्त करने हो सकता है। आप group_name ऑर्डर में गुणों को पुनर्प्राप्त करने के लिए अपने has_many: गुण एसोसिएशन को संशोधित करने में सक्षम हो सकते हैं - फिर जब आप एक नया समूह हो तो% h3 जोड़ सकते हैं।

- previous_group_name = nil 
= form.fields_for :properties do |pform| 
    - if pform.object.group_name != previous_group_name 
    %h3= pform.object.group_name 
    = pform.input :value 
    - previous_group_name = pform.object.group_name 

आप के लिए कुछ विचार ...

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