/ Published in: Ruby
Expand |
Embed | Plain Text
# lib/widgets/widget.rb # Superclass for our form element "widgets" class Widget include Merb::GlobalHelpers # This is necessary to include Merb::GlobalHelpers class_inheritable_accessor :_default_builder # These are for convenience attr_accessor :params attr_accessor :session def initialize(params = {}, session = {}) self.params = params self.session = session end def value end end # lib/widgets/weight_input_switcher.rb class WeightInputSwitcher < Widget attr_accessor :attribute_name, :weight_in_kg, :unit_preference # View methods def setup(attribute_name, weight_in_kg = nil, unit_preference = session[:unit_preference]) self.attribute_name = attribute_name self.weight_in_kg = weight_in_kg self.unit_preference = unit_preference self end def switcher html = "<div class='weight_input_switcher'>" html += weight_input("lbs") html += weight_input("kg") html += weight_input("st") html += "</div>" html end def weight_input html = "<span class='weight_input #{unit_preference}'>" html += weight_input_field html += "</span>" end def weight_input_field if unit_preference == "st" stone, lbs = if weight_in_kg.to_i == 0 ["",""] else weight_input_value(weight_in_kg, unit_preference).split(" st ") end html = text_field attribute_name, :value => stone, :name => "weight_input[stone]", :class => "weight_input_field stone" html += "<span class='weight_unit'>stone</span>" html += text_field attribute_name, :value => lbs, :name => "weight_input[lbs]", :class => "weight_input_field stone lbs" html += "<span class='weight_unit'>lbs</span>" else value = weight_input_value(weight_in_kg, unit_preference) html = text_field attribute_name, :value => value, :name => "weight_input", :class => "weight_input_field" html += "<span class='weight_unit'>" + unit_preference.to_s + "</span>" end html end # Parse methods # We kinda cheat here and use params. Need to figure out a better way to do this. def value if params["weight_input"]["stone"] "#{params["weight_input"]["stone"]} st #{params["weight_input"]["lbs"]} lbs" else "#{params["weight_input"]} #{Units.weight_full_to_abbreviation_map[unit_preference]}" end end private def weight_input_value(weight_in_kg, unit_preference) begin weight_in_kg.to_display_weight_without_unit(unit_preference) rescue "" end end end # The following is added to global_helpers.rb def widget(klass, *args) klass.new(params, session).setup(*args) end # An example of using the "Widget" to display form elements widget(WeightInputSwitcher, :weight, @current_user.current_weight).switcher # An example of using the "Widget" to get the value of form elements weight_widget = widget(WeightInputSwitcher, :weight, 0, "", user[:unit_preference]) weight = weight_widget.value
You need to login to post a comment.
