2011-11-25 13 views
9

को पुन: सक्रिय नहीं करती है मुझे गैर-ActiveRecord मॉडल के ऐरे विशेषता पर काम करने के लिए fields_for प्राप्त करने में समस्या हो रही है।form_for गैर-एआर मॉडल - फ़ील्ड_for ऐरे विशेषता

नीचे आसुत, मैं निम्नलिखित है:

मॉडल/parent.rb

class Parent 
    extend ActiveModel::Naming 
    include ActiveModel::Conversion 
    include ActiveModel::Validations 
    extend ActiveModel::Translation 

    attr_accessor :bars 
end 

नियंत्रकों/parent_controller.rb

def new_parent 
    @parent = Parent.new 

    @parent.bars = ["hello", "world"] 
    render 'new_parent' 
end 

विचारों/new_parent.html.haml

= form_for @parent, :url => new_parent_path do |f| 
    = f.fields_for :bars, @parent.bars do |r| 
    = r.object.inspect 

उपरोक्त कोड के साथ, मेरे पृष्ठ में ["hello", "world"] है - यानी inspect का परिणाम bars पर दिए गए ऐरे पर बुलाया गया है। (@parent.barsfields_for लाइन से छोड़ा गया, मुझे बस nil प्रदर्शित हुआ)।

मैं fields_for एआर एसोसिएशन के रूप में कैसे व्यवहार कर सकता हूं - यानी, bars सरणी के प्रत्येक सदस्य के लिए ब्लॉक में कोड निष्पादित कर सकता हूं?

+0

इसके लिए धन्यवाद। मैंने नहीं सोचा था कि किसी और ने ऐसा करने की कोशिश की थी! धन्यवाद ... बहुत कुछ! – Nitrodist

उत्तर

11

मुझे लगता है कि सही तकनीक है:

= form_for @parent, :url => new_parent_path do |f| 
    - @parent.bars.each do |bar| 
    = f.fields_for "bars[]", bar do |r| 
     = r.object.inspect 

काफी कारण है कि यह सिर्फ काम करने के लिए नहीं किया जा सकता मुझे यकीन है कि नहीं कर रहा हूँ, लेकिन यह चाल करने के लिए लगता है।

1

मुझे लगता है कि यह प्रत्येक की आवश्यकता के बिना किया जा सकता है:

= form_for @parent, :url => new_parent_path do |f| 
    = f.fields_for :bars do |r| 
    = r.object.inspect 

आप कुछ तरीकों कि माता-पिता कक्षा में उम्मीद कर रहे हैं संग्रह की पहचान के लिए सेट करना होगा।

class Parent 
    def bars_attributes= attributes 
    end 
end 

और तुम भी सुनिश्चित करें कि सरणी में वस्तुओं कायम (ताकि आप तार का उपयोग नहीं कर सकते हैं) :(

0

मैं fields_for छोड़ दिया और कई जोड़ा का जवाब करने की आवश्यकता होगी: सच

= form_for @parent, :url => new_parent_path do |f| 
    - @parent.bars.each_with_index do |bar, i| 
    = f.text_field :bars, value: bar, multiple: true, id: "bar#{i}" 
संबंधित मुद्दे