2013-10-02 52 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_messagesArray

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

請注意,如果類型不匹配,則可能必須轉換現有字段。

+0

如何在rails 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