mặc dù câu hỏi là khá cũ ai đó có thể thấy nó hữu ích, cũng khá mới trong ruby và đường ray để có thể có một cách tốt hơn để làm điều này.
Trong mô hình:
#user.rb
attr_accessible :preferences
store :preferences
sau đó dưới dạng một phần:
#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 %>
Bây giờ thêm một số trường bổ sung từ hình thức ive tạo 2 attr_accessor trong mô hình:
attr_accessible ... , :new_pref_key, :new_pref_val
attr_accessor ... , :new_pref_key, :new_pref_val
sau đó thêm 2 trường mới vào biểu mẫu
<%= f.label :new_pref_key %>
<%= f.text_field :new_pref_key %>
<%= f.label :new_pref_val %>
<%= f.text_field :new_pref_val %>
trên bộ điều khiển của tôi làm một chức năng kiểm tra sự hiện diện của các lĩnh vực mới và sau đó hợp nhất các giá trị trước của prefs với những cái mới, như thế này:
#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
...
làm điều đó tôi trở về nó và chuyển nó đến update_attributes, hy vọng nó đã giúp!