Я боролся с очень похожей проблемой. Решения, которые я нашел здесь, были очень полезны для меня. Спасибо @austinfromboston, @ Christian-Butske, @sbzoom и всем остальным. Тем не менее, я думаю, что эти ответы могут быть немного устаревшими. Вот что мне помогло с Rails 5 и ruby 2.3:
В форме:
<%= f.label :options %>
<%= f.fields_for :options do |o| %>
<%= o.label :axis_y %>
<%= o.text_field :axis_y %>
<%= o.label :axis_x %>
<%= o.text_field :axis_x %>
...
<% end %>
и затем в контроллере мне пришлось обновить сильные параметры примерно так:
def widget_params
params.require(:widget).permit(:any, :regular, :parameters, :options => [:axis_y, :axis_x, ...])
end
Кажется, важно, чтобы сериализованный хэш-параметр был в конце списка параметров. В противном случае Rails будет ожидать, что следующий параметр также будет сериализованным хэшем.
В представлении я использовал простую логику if / then, чтобы отображать хеш, только если он не пустой, а затем отображать только пары ключ / значение, в которых значение не равно nil.