2013-10-02 5 views
28

में जोड़ने के लिए मैं जो एक धारावाहिक क्षेत्र है एक मौजूदा उपयोगकर्ता है और मैं सरणी/धारावाहिक क्षेत्र के लिए हाल के संदेश को जोड़ने में सक्षम होना चाहता हूँ।कैसे एक धारावाहिक सरणी

class User < ActiveRecord::Base 
serialize :recent_messages 
end 

नियंत्रक मैं

@user = current_user 
@user.recent_messages << params[:message] 
@user.save 

की कोशिश की है, लेकिन मैं में मिल निम्न त्रुटि:

NoMethodError (undefined method `<<' for nil:NilClass): 

मेरी स्कीमा में मेरे पास है:

create_table "users", :force => true do |t| 
    t.text  "recent_messages" 
    end 

कोई भी विचार मैं कहां गलत हो रहा हूँ?

+0

संदर्भ के लिए: आप के लिए https://stackoverflow.com/questions/45066671/how-can-i-get-rails-to-automatically-populate-a-dynamically-generated-form/45067018#45067018 देख सकते हैं सरणी के संबंध में अच्छी तरह से व्यवहार करने वाले फॉर्म बनाना – user1876508

उत्तर

48

आप serialize करने के लिए एक वर्ग पारित कर सकते हैं होगा:

class User < ActiveRecord::Base 
    serialize :recent_messages, Array 
end 

ऊपर सुनिश्चित करता है कि recent_messages एक Array है:

User.new 
#=> #<User id: nil, recent_messages: [], created_at: nil, updated_at: nil> 

ध्यान दें कि यदि मौजूदा मिलान नहीं होते हैं तो आपको मौजूदा फ़ील्ड को परिवर्तित करना पड़ सकता है।

+0

रेल 5.x में कैसे करें? यह रेल 5 में काम नहीं कर रहा है – Jaswinder

1

ऐसा इसलिए है क्योंकि पहली बार जब आप किसी आइटम को अपने recent_messages पर धक्का देने का प्रयास करते हैं, तो आइटम को धक्का देने के लिए कोई सरणी नहीं है (फ़ील्ड डिफ़ॉल्ट रूप से nil है)। तो अगर आप इससे पहले कि आप इसे करने के लिए धक्का कर सकते हैं सरणी बनाने चाहिए

@user = current_user 
if @user.recent_messages.nil? 
    @user.recent_messages = [params[:message]] 
else 
    @user.recent_messages << params[:message] 
end 
@user.save 
1

तुम भी कोड निम्न का प्रयास कर सकते हैं: - डिफ़ॉल्ट @user.recent_messages तक हो नहीं के बराबर

@user.recent_messages ||= [] 
@user.recent_messages << params[:message] 
@user.save 
संबंधित मुद्दे