diff --git a/lib/semantic_rails_view_helpers/attributes_builder.rb b/lib/semantic_rails_view_helpers/attributes_builder.rb index dc3a067..aeddd2d 100644 --- a/lib/semantic_rails_view_helpers/attributes_builder.rb +++ b/lib/semantic_rails_view_helpers/attributes_builder.rb @@ -1,56 +1,7 @@ -require 'delegate' +require 'semantic_rails_view_helpers/attributes_builder_base' module SemanticRailsViewHelpers - class AttributesBuilder < SimpleDelegator - attr_reader :object - - def initialize(object, context, block) - @object, @context, @block = object, context, block - end - - def __getobj__ - @object - end - - def to_s - @context.capture(self, &@block) - end - - def field(field, options = {}, &block) - if options[:value] - raw_value = options[:value] - else - raw_value = @object.send(field) - - if block - raw_value = block.call(raw_value) - end - end - - value = raw_value - value = value.to_label if value.respond_to?(:to_label) - value = @context.content_tag(:data, value, 'data-field' => field) - - if options[:as] - value = @context.render(:partial => "attributes/#{options[:as]}", :locals => { :object => @object, :field => field, :raw_value => raw_value, :value => value }) - end - - (value or '').html_safe - end - - class TagBuilder - def initialize(attributes_builder) - @attributes_builder = attributes_builder - end - - def method_missing(tag, field, options = {}) - @attributes_builder.context.content_tag(tag, ) - end - end - - def tag - TagBuilder.new(self) - end + class AttributesBuilder < AttributesBuilderBase end end diff --git a/lib/semantic_rails_view_helpers/attributes_builder_base.rb b/lib/semantic_rails_view_helpers/attributes_builder_base.rb new file mode 100644 index 0000000..8be9bab --- /dev/null +++ b/lib/semantic_rails_view_helpers/attributes_builder_base.rb @@ -0,0 +1,56 @@ +require 'delegate' + +module SemanticRailsViewHelpers + class AttributesBuilderBase < SimpleDelegator + attr_reader :object + + def initialize(object, context, block) + @object, @context, @block = object, context, block + end + + def __getobj__ + @object + end + + def to_s + @context.capture(self, &@block) + end + + def field(field, options = {}, &block) + if options[:value] + raw_value = options[:value] + else + raw_value = @object.send(field) + + if block + raw_value = block.call(raw_value) + end + end + + value = raw_value + value = value.to_label if value.respond_to?(:to_label) + value = @context.content_tag(:data, value, 'data-field' => field) + + if options[:as] + value = @context.render(:partial => "attributes/#{options[:as]}", :locals => { :object => @object, :field => field, :raw_value => raw_value, :value => value }) + end + + (value or '').html_safe + end + + class TagBuilder + def initialize(attributes_builder) + @attributes_builder = attributes_builder + end + + def method_missing(tag, field, options = {}) + @attributes_builder.context.content_tag(tag) + end + end + + def tag + TagBuilder.new(self) + end + end +end + diff --git a/lib/semantic_rails_view_helpers/attributes_table_builder.rb b/lib/semantic_rails_view_helpers/attributes_table_builder.rb new file mode 100644 index 0000000..fde8b98 --- /dev/null +++ b/lib/semantic_rails_view_helpers/attributes_table_builder.rb @@ -0,0 +1,20 @@ +require 'semantic_rails_view_helpers/attributes_builder_base' + +module SemanticRailsViewHelpers + class AttributesTableBuilder < AttributesBuilderBase + def to_s + @context.content_tag(:table) do + @context.capture(self, &@block) + end + end + + def field(field, options = {}, &block) + value = super + + @context.content_tag(:tr) do + @context.content_tag(:th, @context.t(".#{field}")) << @context.content_tag(:td, value) + end.html_safe + end + end +end + diff --git a/lib/semantic_rails_view_helpers/view_helpers.rb b/lib/semantic_rails_view_helpers/view_helpers.rb index 7c68702..dfe8a73 100644 --- a/lib/semantic_rails_view_helpers/view_helpers.rb +++ b/lib/semantic_rails_view_helpers/view_helpers.rb @@ -1,4 +1,5 @@ require 'semantic_rails_view_helpers/attributes_builder' +require 'semantic_rails_view_helpers/attributes_table_builder' module SemanticRailsViewHelpers module ViewHelpers @@ -6,6 +7,10 @@ module SemanticRailsViewHelpers AttributesBuilder.new(object, self, block) end + def attributes_table_for(object, &block) + AttributesTableBuilder.new(object, self, block) + end + def link_to_route(route, *args) link_to t(".#{route}"), send("#{route}_path", *args), 'data-link' => route end