Categories: archive |code

Simple non-model checkbox in Rails

I recently needed to do search in Rails with several checkboxes. The search itself was not model backed, so the check_box tag was out. I decided to use the check_box_tag instead. The problem I had with that was that the check_box_tag had no real easy way of maintaining the state as to whether or not the boxes were checked from search to search.

If I had params[:a] and params[:b], they may both be set, but I wouldn’t know it based off my GET request. So I came up with a simple check_box_tag modification to retain the state of the checkboxes based on an identifier (in my case, I use the params)

In my application_helper.rb:

  def check_box_tag_new(name, value = "1", options = {})
    html_options = { "type" => "checkbox", "name" => name, "id" => name, "value" => value }.update(options.stringify_keys)
    unless html_options["check"].nil?
      html_options["checked"] = "checked" if html_options["check"].to_i == 1
    end
    tag :input, html_options
  end

Usage in a Haml file:

= check_box_tag_new :a, 1, :check => params[:a]
= check_box_tag_new :b, 1, :check => params[:b]

Here’s what I came up with for specs:

  describe "should create a check_box tag with the proper checked based on params:" do
    it "if check is nil, it should not be checked" do
      tag = helper.check_box_tag_new("me", nil, {:check => nil})
      tag.should == "<input id="me" name="me" type="checkbox" />"
    end

    it "if check is not 1, it should not be checked" do
      tag = helper.check_box_tag_new("me", nil, {:check => 0})
      tag.should == "<input check="0" id="me" name="me" type="checkbox" />"
    end

    it "if check is 1, it should be checked" do
      tag = helper.check_box_tag_new("me", nil, {:check => 1})
      tag.should == "<input check="1" checked="checked" id="me" name="me" type="checkbox" />"
    end
  end