How to edit a Rails serialized field in a form?
forms, ruby-on-rails, serialization
Solution
If you know what the option keys are going to be in advance, you can declare special getters and setters for them like so:
class Widget < ActiveRecord::Base
serialize :options
def self.serialized_attr_accessor(*args)
args.each do |method_name|
eval "
def #{method_name}
(self.options || {})[:#{method_name}]
end
def #{method_name}=(value)
self.options ||= {}
self.options[:#{method_name}] = value
end
attr_accessible :#{method_name}
"
end
end
serialized_attr_accessor :query_id, :axis_y, :axis_x, :units
end
The nice thing about this is that it exposes the components of the options array as attributes, which allows you to use the Rails form helpers like so:
#haml
- form_for @widget do |f|
= f.text_field :axis_y
= f.text_field :axis_x
= f.text_field :unit
Problem
I have a data model in my Rails project that has a serialized field: ``` class Widget < ActiveRecord::Base serialize :options end ``` The options field can have variable data info. For example, here is the options field for one record from the fixtures file: ``` options: query_id: 2 axis_y: 'percent' axis_x: 'text' units: '%' css_class: 'occupancy' dom_hook: '#average-occupancy-by-day' table_scale: 1 ``` My question is what is the proper way to let a user edit this info in a standard form view? If you just use a simple text area field for the options field, you would just get a yaml dump representation and that data would just be sent back as a string. What is the best/proper way to edit a serialized hash field like this in Rails?