Хотя вопрос довольно старый, кто-то еще может найти его полезным, но я также довольно нов в рубине и рельсах, так что может быть лучший способ сделать это.
В модели:
#user.rb
attr_accessible :preferences
store :preferences
тогда в частичной форме:
#views/users/_form.rb
<% @user.preferences.each do |k, v| %>
<% form.fields_for :preferences, @user.preferences[k] do |p| %>
<div class="field">
<%= p.label k %>
<br/>
<%= p.text_field k, :value => v %>
</div>
<% end %>
<% end %>
Теперь, чтобы добавить несколько дополнительных полей из формы, я создал 2 attr_accessor в модели:
attr_accessible ... , :new_pref_key, :new_pref_val
attr_accessor ... , :new_pref_key, :new_pref_val
затем добавил 2 новых поля в форму
<%= f.label :new_pref_key %>
<%= f.text_field :new_pref_key %>
<%= f.label :new_pref_val %>
<%= f.text_field :new_pref_val %>
на моем контроллере я сделал функцию, которая проверяет наличие новых полей и затем объединяет предыдущие значения префов с новыми, как это:
#users_controller.rb
...
new_key = params[:user][:preferences][:new_pref_key]
new_val = params[:user][:preferences][:new_pref_val]
new_preference = {
new_key => new_val
}
current_params = params[:user][:preferences].merge! new_preference
...
сделал, что я вернул его и передал update_attributes, надеюсь, это помогло!