check_box.rb 1.8 KB
Newer Older
1 2
require 'action_view/helpers/tags/checkable'

R
Rafael Mendonça França 已提交
3 4 5 6
module ActionView
  module Helpers
    module Tags
      class CheckBox < Base #:nodoc:
7 8
        include Checkable

R
Rafael Mendonça França 已提交
9 10 11 12 13 14 15 16 17 18
        def initialize(object_name, method_name, template_object, checked_value, unchecked_value, options)
          @checked_value   = checked_value
          @unchecked_value = unchecked_value
          super(object_name, method_name, template_object, options)
        end

        def render
          options = @options.stringify_keys
          options["type"]     = "checkbox"
          options["value"]    = @checked_value
19
          options["checked"] = "checked" if input_checked?(object, options)
R
Rafael Mendonça França 已提交
20 21 22 23 24 25 26

          if options["multiple"]
            add_default_name_and_id_for_value(@checked_value, options)
            options.delete("multiple")
          else
            add_default_name_and_id(options)
          end
27

28
          include_hidden = options.delete("include_hidden") { true }
R
Rafael Mendonça França 已提交
29
          checkbox = tag("input", options)
30 31 32 33 34 35 36

          if include_hidden
            hidden = hidden_field_for_checkbox(options)
            hidden + checkbox
          else
            checkbox
          end
R
Rafael Mendonça França 已提交
37 38 39 40
        end

        private

41
        def checked?(value)
R
Rafael Mendonça França 已提交
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
          case value
          when TrueClass, FalseClass
            value
          when NilClass
            false
          when Integer
            value != 0
          when String
            value == @checked_value
          when Array
            value.include?(@checked_value)
          else
            value.to_i != 0
          end
        end
57 58 59 60

        def hidden_field_for_checkbox(options)
          @unchecked_value ? tag("input", options.slice("name", "disabled", "form").merge!("type" => "hidden", "value" => @unchecked_value)) : "".html_safe
        end
R
Rafael Mendonça França 已提交
61 62 63 64
      end
    end
  end
end