我有一个现有用户,它有一个序列化字段,我希望能够将最近的消息添加到数组/序列化字段。
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 :(得分:53)
您可以将课程传递给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>
请注意,如果类型不匹配,您可能必须转换现有字段。
答案 1 :(得分:2)
这是因为您第一次尝试将项目推送到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
答案 2 :(得分:2)
您还可以尝试以下代码: - 默认情况下@user.recent_messages
将为nil
@user.recent_messages ||= []
@user.recent_messages << params[:message]
@user.save