【问题标题】:How to add to a serialized array如何添加到序列化数组
【发布时间】:2013-10-08 16:16:46
【问题描述】:

我有一个具有序列化字段的现有用户,我希望能够将最近的消息添加到数组/序列化字段。

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

关于我哪里出错了有什么想法吗?

【问题讨论】:

标签: ruby-on-rails ruby serialization


【解决方案1】:

您也可以尝试以下代码:- 默认情况下,@user.recent_messages 将为 nil

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

【讨论】:

    【解决方案2】:

    您可以将课程传递给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>
    

    请注意,如果类型不匹配,您可能必须转换现有字段。

    【讨论】:

      【解决方案3】:

      这是因为当您第一次尝试将项目推送到您的 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
      

      【讨论】:

        猜你喜欢
        • 2016-10-16
        • 2021-08-23
        • 1970-01-01
        • 2018-06-09
        • 2020-10-17
        • 1970-01-01
        • 1970-01-01
        • 2010-12-12
        • 1970-01-01
        相关资源
        最近更新 更多