2012-11-22 10 views
10

हम इस तरह रेल में ActiveRecord की "को क्रमानुसार" सुविधा का उपयोग कर रहे हैं:एक रेल में ActiveRecord मॉडल के लिए एक धारावाहिक ऐरे विशेषता कैसे दिखाना है?

class User < ActiveRecord::Base 
    serialize :favorite_colors, Array 
    .... 
end 

तो हम

u = User.last 
u.favorite_colors = [ 'blue', 'red', 'grey' ] 
u.save! 

तो मूल रूप से ActiveRecord एक डेटाबेस में ऊपर सरणी और यह भंडार serializing है हो सकता है फ़ील्ड पसंदीदा_colors कहा जाता है।

मेरा प्रश्न है: आप किसी उपयोगकर्ता को अपने पसंदीदा रंगों को किसी रूप में कैसे दर्ज करने की अनुमति देते हैं? क्या आप टेक्स्टफील्ड की एक श्रृंखला का उपयोग करते हैं? और एक बार प्रवेश करने के बाद, आप उन्हें संपादित करने के लिए उन्हें एक रूप में कैसे दिखाते हैं?

यह धारावाहिक सरणी विशेषता के लिए रेल फॉर्म हेल्पर्स से संबंधित एक प्रश्न है। एआर विशेषताओं को

धन्यवाद

उत्तर

2

उपयोग की अनुमति के लिए, आपको इस तरह से उन्हें प्रदान करने के लिए है:

class User < ActiveRecord::Base 
    serialize :favorite_colors, Array 
    attr_accessible :favorite_colors 
    .... 
end 
+0

धन्यवाद, लेकिन मेरा सवाल इस क्षेत्र के संपादन की अनुमति देने के लिए फ़ॉर्म में इस सरणी विशेषता को दिखाने के तरीके के बारे में है। –

+0

ओह क्षमा करें - इसे गलत समझाओ ... भले ही मैंने सवाल संपादित किया - मेरी गलती – awenkhh

3

आप बहु-चयन HTML फ़ील्ड चाहते हैं, की कोशिश:

= form_for @user do |f| 
    = f.select :favorite_colors, %w[full colors list], {}, :multiple => true 

यदि आप simple_form मणि का उपयोग कर रहे हैं, तो आप विकल्पों को चेक बॉक्स आसानी से देख सकते हैं:

= simple_form_for @user do |f| 
    = f.input :favorite_colors, as: :check_boxes, collection: %w[full colors list] 
+1

टिप्पणी के लिए धन्यवाद। हालांकि, मैं नहीं चाहता कि उपयोगकर्ता पूर्व परिभाषित रंगों की सूची से चयन करे।मैं चाहता हूं कि उपयोगकर्ता खुद को टेक्स्ट बॉक्स की श्रृंखला में रंगों में प्रवेश करे। प्रति रंग एक पाठ बॉक्स। क्या मैं इसके लिए कुछ फॉर्म हेल्पर्स का उपयोग कर सकता हूं? या क्या मुझे इसे स्वयं कोड करना है, जैसे फॉर्म में "आभासी" विशेषता बनाएं और फिर नियंत्रक में update_attribites को कॉल करने से पहले उन्हें सरणी में विलय करें? –

2

मैं ध्यान में रखते हुए सरणी 'सपाट' और नियंत्रक में सरणी पुनर्गठन इस समस्या का समाधान है।

मॉडल में कुछ बदलावों की भी आवश्यकता है, नीचे देखें।

class User < ActiveRecord::Base 

    serialize :favorite_colors, Array 

    def self.create_virtual_attributes (*args) 
     args.each do |method_name| 
      10.times do |key| 
       define_method "#{method_name}_#{key}" do 
       end 
       define_method "#{method_name}_#{key}=" do 
       end 
      end 
     end 
    end 

    create_virtual_attributes :favorite_colors 
end 

आप ऊपर की तरह पद्धतियां निर्धारित नहीं है, तो रेल प्रपत्र तत्व के इस तरह के "favorite_colors_0" (नीचे देखें) के रूप में ध्यान में रखते हुए नाम, के बारे में शिकायत करेंगे।

ध्यान में रखते हुए मैं गतिशील 10 पाठ क्षेत्रों, favorite_colors_0, favorite_colors_1, आदि

<% 10.times do |key| %> 
    <%= form.label :favorite_color %> 
    <%= form.text_field "favorite_colors_#{key}", :value => @user.favorite_colors[key] %> 
<% end %> 

नियंत्रक में बनाते हैं, तो मैं बचाने या update_attributes कॉल करने से पहले एक सरणी में favorite_colors_ * पाठ फ़ील्ड मर्ज करने के लिए है :

unless params[:user].select{|k,v| k =~ /^favorite_colors_/}.empty? 
    params[:user][:favorite_colors] = params[:user].select{|k,v| k =~ /^favorite_colors_/}.values.reject{|v| v.empty?} 
    params[:user].reject! {|k,v| k=~ /^favorite_colors_/} 
end 

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

आशा है कि आपको यह पोस्ट उपयोगी लगेगा।

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