В моем приложении есть таблица с именем contacts и полем areas_of_interest. В этом поле должны храниться хэши, отправленные пользователем через форму. Однако моя база данных отклоняет эти хэши и оставляет это поле пустым каждый раз, когда я хочу его сохранить:
Схема:
create_table "contacts", force: :cascade do |t|
...
t.text "areas_of_interest"
t.index ["user_id"], name: "index_contacts_on_user_id"
end
Контактная модель:
class Contact < ApplicationRecord
belongs_to :user
serialize :areas_of_interest
...
end
КонтактыКонтроллер:
def update
respond_to do |format|
if @contact.update(contact_params)
format.html do
redirect_to root_path, notice: 'Contact has been updated'
end
else
format.html do
render :edit, notice: 'Error'
end
end
end
end
private
def contact_params
params.require(:contact).permit(
...
:areas_of_interest,
...
)
end
И хеш, отправленный от клиента, выглядит так:
{"first"=>"1", "second"=>"0", "third"=>"0", "fourth"=>"0", "fifth"=>"1"}
Что я могу сделать здесь неправильно и как я могу это исправить?
Где? В модели?
в params.require(:contact).permit(...
Если у вас есть postgres - используйте тип данных jsonb или hstore.





Ваш формат выглядит как дамп Ruby Hash. serialize выполняется с использованием YAML. Это будет выглядеть так.
{ first: "1", second: "0", third: "0", fourth: "0", fifth: "1"}
Но есть лучший способ. Поскольку вы используете Postgres, вы можете воспользоваться Постгрес JSONB и отправить данные в формате JSON. Сериализация будет выполнена за вас, у вас есть все возможности Средства поиска Postgres в формате JSON, а JSON — это стандартный формат, который может создавать большинство языков.
{ "first": "1", "second": "0", "third": "0", "fourth": "0", "fifth": "1"}
create_table "contacts", force: :cascade do |t|
...
t.jsonb :areas_of_interest
t.index [:areas_of_interest], using: :gin
end
Ничего особенного в Contact не нужно. Используйте contact.areas_of_interest как любое другое поле, но оно может принимать хэши и массивы.
areas_of_interest похоже, что он отфильтровывается strong_params. Я думаю, что вам нужно что-то вроде этого, чтобы указать, какие ключи должны быть разрешены:
params.require(:contact).permit(
...
areas_of_interest: [:first, :second, :third, :fourth, :fifth],
...
)
Я также настоятельно рекомендую использовать тип jsonb, упомянутый @Schwern.
изменить
:areas_of_interestнаareas_of_interest: {}