2013-10-02 3 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_messages является Array:

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

Обратите внимание, что вам может потребоваться преобразовать существующие поля, если типы не совпадают.

+0

Как сделать в рельсах 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 
Смежные вопросы