Chociaż pytanie jest dość stare, może ktoś inny uzna to za przydatne, a także całkiem nowe w rubinach i szynach, więc może być lepszy sposób na zrobienie tego.
W modelu
#user.rb
attr_accessible :preferences
store :preferences
następnie w formie częściowej:
#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 %>
Teraz, aby dodać jakieś dodatkowe pola z ive forma utworzona 2 attr_accessor w modelu
attr_accessible ... , :new_pref_key, :new_pref_val
attr_accessor ... , :new_pref_key, :new_pref_val
następnie dodano 2 nowe pola w formularzu
<%= f.label :new_pref_key %>
<%= f.text_field :new_pref_key %>
<%= f.label :new_pref_val %>
<%= f.text_field :new_pref_val %>
na moim kontrolera zrobiłem to sprawdzić obecność nowych złóż, a następnie scalić wcześniejsze wartości w preferencjach na nowe, tak funkcję:
#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
...
zrobić, że ja go zwrócić i przekazać go do update_attributes, mam nadzieję, że pomogło!