43

How can I make a check box default to being "checked" when it is initially displayed?

I've not found a "Rails" way to do this (that works) so I did it with JavaScript. Is there a proper way to do this in Rails? I'm using Rails 1.2.3.

the Tin Man
  • 158,662
  • 42
  • 215
  • 303
daustin777
  • 12,478
  • 8
  • 25
  • 25

7 Answers7

50

Rails 3.x

= form_for(@user) do |f|
  = f.check_box :subscribe, {checked: true, ...}

This sets the checked state to true and should work fine. Note the ruby 1.9.x syntax of the hash, for ruby 1.8.x use hash tag format {:checked => true, ...}

Matt Smith
  • 3,479
  • 2
  • 28
  • 29
46

If you're using check_box in the context of a form, then the check box will show whatever value that field has.

@user = Person.find(:first)
@user.active = true
check_box 'user', 'active'  #=> will be checked by default

If you're using check_box_tag, the third parameter is the initial state (check_box_tag doc):

check_box_tag "active", 1, true
Dave Powers
  • 2,051
  • 2
  • 30
  • 34
wesgarrison
  • 6,975
  • 5
  • 30
  • 39
  • I'm not reading/writing check_box value to the db, so switching to check_box_tag and using the true switch solved the problem. Thanks! – daustin777 Feb 25 '09 at 17:52
  • The _tag methods are for non-model forms. The non-_tag ones are. – wesgarrison Feb 26 '09 at 16:51
  • @wesgarrison I'm using a check_box_tag like this <%= check_box_tag "benificiary_id[#{b.id}]",b.id,:name => "benificiary_id[]"%> here how do i check whether any record checked or not during update? by default my update action taking all check box values even if some of them unchecked :( – Unknown Coder Nov 06 '11 at 08:35
  • @shreekumar s: Two year old question, you should ask a new question. – wesgarrison Nov 07 '11 at 22:54
7

Simple

<%= f.check_box :subscribe, checked: "checked" %>
rebbailey
  • 714
  • 1
  • 7
  • 16
6

I was shocked that none of the answers solve 100% of the problem.
As all suggested solutions will give checked result on edit form, even if the user unchecked the checkbox.

<%= f.check_box :subscribe, checked: @event.new_record? || f.object.subscribe? %>

Works for rails 4 +, not tested below.

GEkk
  • 1,336
  • 11
  • 20
6

In your controller's new action, try:

@user = User.new(:male => true)

Where :male is the attribute you want checked by default on the /users/new pages. This will pass the :male attribute to the view with a value of true, resulting in a checked box.

dwhalen
  • 1,927
  • 12
  • 11
0

I did it in that way.

Add hidden field with value 0 ABOVE check_box_tag

<%= hidden_field_tag :subscribe, '0' %>
<%= check_box_tag :subscribe, '1', params[:subscribe] != '0' %>

On server check with != '0'

subscribe = params[:subscribe] != '0'
0

This works on Rails 2.3.x and Rails 3.0.x!

On action new in the controller, the check box is set to true.

# in the controller
def new
  @user = Person.find(:first)
  @user.active = true
end

In the form: the check box is checked on creation (by call new) but if the validation fails the check box remains set with the value that the user has post.

# in the view
<%= form_for ..... |f| %>
  ...
  <%= f.check_box :active %>
  ...
<% end %>

An other way, but not so good (if you want to change the logic you have to make a new migration) is to set :default => 1 in the migration of the given model and attribute.

class CreatePeople < ActiveRecord::Migration
  def self.up
    create_table :people do |t|
      ...
      t.boolean    :active,             :null => false,
                                        :default => 1
      t.timestamps
    end
  end

  def self.down
    drop_table :people
  end
end
phlegx
  • 2,618
  • 3
  • 35
  • 39