38

シリアル化されたフィールドを持つ既存のユーザーがいて、最近のメッセージを配列/シリアル化されたフィールドに追加できるようにしたいと考えています。

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

私がどこで間違っているのかについてのアイデアはありますか?

4

3 に答える 3

62

クラスを次の場所に渡すことができます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>

タイプが一致しない場合は、既存のフィールドを変換する必要がある場合があることに注意してください。

于 2013-10-02T10:25:11.543 に答える
2

You can also try following code:- By default @user.recent_messages would be nil

@user.recent_messages ||= []
@user.recent_messages << params[:message]
@user.save
于 2013-10-02T10:10:16.467 に答える
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
于 2013-10-02T10:06:05.260 に答える