<%= javascript_include_tag "slider.js" %>
Then we define CSS style for the slider as the same as at the script.aculo.us homepage. (/app/public/stylesheets/style.css)
div.slider { width:256px; margin:10px 0; background-color:#ccc; height:10px; position: relative; } div.slider div.handle { width:10px; height:15px; background-color:#f00; cursor:move; position: absolute; }
Then we create a helper for it. (/app/helpers/application_helper.rb)
def slider(attributes={}) unless attributes.nil? then values=attributes[:values] default_value=attributes[:default_value].to_s object=attributes[:object].to_s instance=attributes[:instance].to_s unit=attributes[:unit] || "" text_div_id=object + "_" + instance + "_slider_text_div" slider_id=object + "_" + instance + "_slider" concat(raw( "<div id=\"#{slider_id}\" class=\"slider\"> <div class=\"handle\"></div> </div>" )) concat(raw(hidden_field(object, instance, :value => default_value.to_i))) concat(raw("<div id=\"#{text_div_id}\">" + default_value + " " + unit + "</div>")) js_text = <<JS3 (function() { var zoom_slider = $('#{slider_id}'); var text_div = $('#{text_div_id}'); var hidden_item = $('#{object + "_" + instance}'); var values=#{values.inspect}; var values_length = values.length; var min=40; var max=200; var unit = Math.ceil((max - min) / values_length); var range = $R(min, max - unit); var pix_values = new Array(); for(i=1;i<=values_length;i++){ pix_values[i-1]=min + (unit * (i - 1)); } var default_value=pix_values[#{values.index(default_value.to_i)}]; new Control.Slider(zoom_slider.down('.handle'), zoom_slider, { range: range, sliderValue: default_value, increment: unit, values: pix_values, onSlide: function(value) { text_div.innerHTML=values[pix_values.indexOf(value)] + " #{unit}"; hidden_item.value=values[pix_values.indexOf(value)]; }, onChange: function(value) { text_div.innerHTML=values[pix_values.indexOf(value)] + " #{unit}"; hidden_item.value=values[pix_values.indexOf(value)]; } }); })(); JS3 concat(raw(javascript_tag(js_text))) end end
Then just define your form element in your view / form:
<table><tbody><tr><td> <% slider :object => "config", :instance => "mem_size", :unit => "MB", :values => [512, 1024, 1536, 2048, 2560, 3072, 4096].sort, :default_value => 1024 %> </td></tr></tbody></table>
That"s all! Questions?