mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Extract common collection helpers to a module to avoid too much inheritance
[Carlos Antonio da Silva + Rafael Mendonça França]
This commit is contained in:
parent
17d214a1d4
commit
36cb7150fd
3 changed files with 93 additions and 69 deletions
|
@ -1,7 +1,11 @@
|
||||||
|
require 'action_view/helpers/tags/collection_helpers'
|
||||||
|
|
||||||
module ActionView
|
module ActionView
|
||||||
module Helpers
|
module Helpers
|
||||||
module Tags
|
module Tags
|
||||||
class CollectionCheckBoxes < CollectionRadioButtons
|
class CollectionCheckBoxes < Base
|
||||||
|
include CollectionHelpers
|
||||||
|
|
||||||
class CheckBoxBuilder < Builder
|
class CheckBoxBuilder < Builder
|
||||||
def check_box(extra_html_options={})
|
def check_box(extra_html_options={})
|
||||||
html_options = extra_html_options.merge(@input_html_options)
|
html_options = extra_html_options.merge(@input_html_options)
|
||||||
|
|
|
@ -0,0 +1,84 @@
|
||||||
|
module ActionView
|
||||||
|
module Helpers
|
||||||
|
module Tags
|
||||||
|
module CollectionHelpers
|
||||||
|
class Builder
|
||||||
|
def initialize(template_object, object_name, method_name,
|
||||||
|
sanitized_attribute_name, text, value, input_html_options)
|
||||||
|
@template_object = template_object
|
||||||
|
@object_name = object_name
|
||||||
|
@method_name = method_name
|
||||||
|
@sanitized_attribute_name = sanitized_attribute_name
|
||||||
|
@text = text
|
||||||
|
@value = value
|
||||||
|
@input_html_options = input_html_options
|
||||||
|
end
|
||||||
|
|
||||||
|
def label(label_html_options={}, &block)
|
||||||
|
@template_object.label(@object_name, @sanitized_attribute_name, @text, label_html_options, &block)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def initialize(object_name, method_name, template_object, collection, value_method, text_method, options, html_options)
|
||||||
|
@collection = collection
|
||||||
|
@value_method = value_method
|
||||||
|
@text_method = text_method
|
||||||
|
@html_options = html_options
|
||||||
|
|
||||||
|
super(object_name, method_name, template_object, options)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def instantiate_builder(builder_class, value, text, html_options)
|
||||||
|
builder_class.new(@template_object, @object_name, @method_name,
|
||||||
|
sanitize_attribute_name(value), text, value, html_options)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
# Generate default options for collection helpers, such as :checked and
|
||||||
|
# :disabled.
|
||||||
|
def default_html_options_for_collection(item, value) #:nodoc:
|
||||||
|
html_options = @html_options.dup
|
||||||
|
|
||||||
|
[:checked, :selected, :disabled].each do |option|
|
||||||
|
next unless @options[option]
|
||||||
|
|
||||||
|
|
||||||
|
accept = if @options[option].respond_to?(:call)
|
||||||
|
@options[option].call(item)
|
||||||
|
else
|
||||||
|
Array(@options[option]).include?(value)
|
||||||
|
end
|
||||||
|
|
||||||
|
if accept
|
||||||
|
html_options[option] = true
|
||||||
|
elsif option == :checked
|
||||||
|
html_options[option] = false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
html_options
|
||||||
|
end
|
||||||
|
|
||||||
|
def sanitize_attribute_name(value) #:nodoc:
|
||||||
|
"#{sanitized_method_name}_#{sanitized_value(value)}"
|
||||||
|
end
|
||||||
|
|
||||||
|
def render_collection #:nodoc:
|
||||||
|
@collection.map do |item|
|
||||||
|
value = value_for_collection(item, @value_method)
|
||||||
|
text = value_for_collection(item, @text_method)
|
||||||
|
default_html_options = default_html_options_for_collection(item, value)
|
||||||
|
|
||||||
|
yield value, text, default_html_options
|
||||||
|
end.join.html_safe
|
||||||
|
end
|
||||||
|
|
||||||
|
def value_for_collection(item, value) #:nodoc:
|
||||||
|
value.respond_to?(:call) ? value.call(item) : item.send(value)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,23 +1,10 @@
|
||||||
|
require 'action_view/helpers/tags/collection_helpers'
|
||||||
|
|
||||||
module ActionView
|
module ActionView
|
||||||
module Helpers
|
module Helpers
|
||||||
module Tags
|
module Tags
|
||||||
class CollectionRadioButtons < CollectionSelect
|
class CollectionRadioButtons < Base
|
||||||
class Builder
|
include CollectionHelpers
|
||||||
def initialize(template_object, object_name, method_name,
|
|
||||||
sanitized_attribute_name, text, value, input_html_options)
|
|
||||||
@template_object = template_object
|
|
||||||
@object_name = object_name
|
|
||||||
@method_name = method_name
|
|
||||||
@sanitized_attribute_name = sanitized_attribute_name
|
|
||||||
@text = text
|
|
||||||
@value = value
|
|
||||||
@input_html_options = input_html_options
|
|
||||||
end
|
|
||||||
|
|
||||||
def label(label_html_options={}, &block)
|
|
||||||
@template_object.label(@object_name, @sanitized_attribute_name, @text, label_html_options, &block)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
class RadioButtonBuilder < Builder
|
class RadioButtonBuilder < Builder
|
||||||
def radio_button(extra_html_options={})
|
def radio_button(extra_html_options={})
|
||||||
|
@ -37,57 +24,6 @@ module ActionView
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def instantiate_builder(builder_class, value, text, html_options)
|
|
||||||
builder_class.new(@template_object, @object_name, @method_name,
|
|
||||||
sanitize_attribute_name(value), text, value, html_options)
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
# Generate default options for collection helpers, such as :checked and
|
|
||||||
# :disabled.
|
|
||||||
def default_html_options_for_collection(item, value) #:nodoc:
|
|
||||||
html_options = @html_options.dup
|
|
||||||
|
|
||||||
[:checked, :selected, :disabled].each do |option|
|
|
||||||
next unless @options[option]
|
|
||||||
|
|
||||||
|
|
||||||
accept = if @options[option].respond_to?(:call)
|
|
||||||
@options[option].call(item)
|
|
||||||
else
|
|
||||||
Array(@options[option]).include?(value)
|
|
||||||
end
|
|
||||||
|
|
||||||
if accept
|
|
||||||
html_options[option] = true
|
|
||||||
elsif option == :checked
|
|
||||||
html_options[option] = false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
html_options
|
|
||||||
end
|
|
||||||
|
|
||||||
def sanitize_attribute_name(value) #:nodoc:
|
|
||||||
"#{sanitized_method_name}_#{sanitized_value(value)}"
|
|
||||||
end
|
|
||||||
|
|
||||||
def render_collection #:nodoc:
|
|
||||||
@collection.map do |item|
|
|
||||||
value = value_for_collection(item, @value_method)
|
|
||||||
text = value_for_collection(item, @text_method)
|
|
||||||
default_html_options = default_html_options_for_collection(item, value)
|
|
||||||
|
|
||||||
yield value, text, default_html_options
|
|
||||||
end.join.html_safe
|
|
||||||
end
|
|
||||||
|
|
||||||
def value_for_collection(item, value) #:nodoc:
|
|
||||||
value.respond_to?(:call) ? value.call(item) : item.send(value)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue