2013-10-02 11 views
28

シリアライズされたフィールドを持つ既存のユーザーがいて、最近のメッセージを配列/シリアル化されたフィールドに追加できます。私が持っている私のスキーマでシリアライズされた配列に追加する方法

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

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

任意のアイデア私が

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

を試みたが、私は次のエラーを取得するコントローラで

class User < ActiveRecord::Base 
serialize :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にクラスを渡すことができnilを次のようになります。

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 
関連する問題