Module: Alba::Resource::ClassMethods
- Included in:
- Alba::Resource
- Defined in:
- lib/alba/resource.rb
Overview
Class methods
Instance Method Summary collapse
-
#association(name, condition = nil, resource: nil, key: nil, params: {}, **options, &block) ⇒ void
(also: #one, #many, #has_one, #has_many)
Set association.
-
#attribute(name, **options, &block) ⇒ void
Set an attribute with the given block.
-
#attributes(*attrs, if: nil, **attrs_with_types) ⇒ void
Set multiple attributes at once.
-
#collection_key(key) ⇒ Object
Sets key for collection serialization.
-
#helper(mod = @_helper || Module.new, &block) ⇒ Object
Define helper methods.
-
#layout(file: nil, inline: nil) ⇒ Object
Set layout.
-
#meta(key = :meta, &block) ⇒ Object
Set metadata.
-
#method_added(method_name) ⇒ Object
This ‘method_added` is used for defining “resource methods”.
-
#nested_attribute(name, **options, &block) ⇒ void
(also: #nested)
Set a nested attribute with the given block.
-
#on_error(handler = nil, &block) ⇒ Object
Set error handler If this is set it’s used as a error handler overriding global one.
-
#on_nil(&block) ⇒ Object
Set nil handler.
-
#prefer_object_method! ⇒ Object
DSL for alias, purely for readability.
-
#prefer_resource_method! ⇒ Object
DSL for alias, purely for readability.
-
#root_key(key, key_for_collection = nil) ⇒ Object
Set root key.
-
#root_key! ⇒ Object
Set root key to true.
-
#root_key_for_collection(key) ⇒ Object
Set root key for collection.
-
#transform_keys(type, root: true, cascade: true) ⇒ Object
Transform keys as specified type.
-
#transform_keys!(type) ⇒ Object
Transform keys as specified type AFTER the class is defined Note that this is an experimental API and may be removed/changed.
Instance Method Details
#association(name, condition = nil, resource: nil, key: nil, params: {}, **options, &block) ⇒ void Also known as: one, many, has_one, has_many
This method returns an undefined value.
Set association
374 375 376 377 378 379 380 |
# File 'lib/alba/resource.rb', line 374 def association(name, condition = nil, resource: nil, key: nil, params: {}, **, &block) transformation = @_key_transformation_cascade ? @_transform_type : :none assoc = Association.new( name: name, condition: condition, resource: resource, params: params, nesting: nesting, key_transformation: transformation, helper: @_helper, &block ) @_attributes[key&.to_sym || name.to_sym] = [:if] ? ConditionalAttribute.new(body: assoc, condition: [:if]) : assoc end |
#attribute(name, **options, &block) ⇒ void
This method returns an undefined value.
Set an attribute with the given block
356 357 358 359 360 |
# File 'lib/alba/resource.rb', line 356 def attribute(name, **, &block) raise ArgumentError, 'No block given in attribute method' unless block @_attributes[name.to_sym] = [:if] ? ConditionalAttribute.new(body: block, condition: [:if]) : block end |
#attributes(*attrs, if: nil, **attrs_with_types) ⇒ void
This method returns an undefined value.
Set multiple attributes at once
322 323 324 325 326 |
# File 'lib/alba/resource.rb', line 322 def attributes(*attrs, if: nil, **attrs_with_types) if_value = binding.local_variable_get(:if) assign_attributes(attrs, if_value) assign_attributes_with_types(attrs_with_types, if_value) end |
#collection_key(key) ⇒ Object
Sets key for collection serialization
492 493 494 |
# File 'lib/alba/resource.rb', line 492 def collection_key(key) @_collection_key = key.to_sym end |
#helper(mod = @_helper || Module.new, &block) ⇒ Object
Define helper methods
529 530 531 532 533 |
# File 'lib/alba/resource.rb', line 529 def helper(mod = @_helper || Module.new, &block) mod.module_eval(&block) if block extend mod @_helper = mod end |
#layout(file: nil, inline: nil) ⇒ Object
Set layout
446 447 448 |
# File 'lib/alba/resource.rb', line 446 def layout(file: nil, inline: nil) @_layout = Layout.new(file: file, inline: inline) end |
#meta(key = :meta, &block) ⇒ Object
Set metadata
438 439 440 |
# File 'lib/alba/resource.rb', line 438 def (key = :meta, &block) @_meta = [key, block] end |
#method_added(method_name) ⇒ Object
This ‘method_added` is used for defining “resource methods”
302 303 304 305 |
# File 'lib/alba/resource.rb', line 302 def method_added(method_name) _resource_methods << method_name.to_sym unless method_name.to_sym == :_setup super end |
#nested_attribute(name, **options, &block) ⇒ void Also known as: nested
This method returns an undefined value.
Set a nested attribute with the given block
403 404 405 406 407 408 409 |
# File 'lib/alba/resource.rb', line 403 def nested_attribute(name, **, &block) raise ArgumentError, 'No block given in attribute method' unless block key_transformation = @_key_transformation_cascade ? @_transform_type : :none attribute = NestedAttribute.new(key_transformation: key_transformation, &block) @_attributes[name.to_sym] = [:if] ? ConditionalAttribute.new(body: attribute, condition: [:if]) : attribute end |
#on_error(handler = nil, &block) ⇒ Object
Set error handler If this is set it’s used as a error handler overriding global one
501 502 503 504 505 506 |
# File 'lib/alba/resource.rb', line 501 def on_error(handler = nil, &block) raise ArgumentError, 'You cannot specify error handler with both Symbol and block' if handler && block raise ArgumentError, 'You must specify error handler with either Symbol or block' unless handler || block @_on_error = block || validated_error_handler(handler) end |
#on_nil(&block) ⇒ Object
Set nil handler
522 523 524 |
# File 'lib/alba/resource.rb', line 522 def on_nil(&block) @_on_nil = block end |
#prefer_object_method! ⇒ Object
DSL for alias, purely for readability
541 542 543 |
# File 'lib/alba/resource.rb', line 541 def prefer_object_method! alias_method :fetch_attribute_from_object_and_resource, :_fetch_attribute_from_object_first end |
#prefer_resource_method! ⇒ Object
DSL for alias, purely for readability
536 537 538 |
# File 'lib/alba/resource.rb', line 536 def prefer_resource_method! alias_method :fetch_attribute_from_object_and_resource, :_fetch_attribute_from_resource_first end |
#root_key(key, key_for_collection = nil) ⇒ Object
Set root key
417 418 419 420 |
# File 'lib/alba/resource.rb', line 417 def root_key(key, key_for_collection = nil) @_key = key.to_sym @_key_for_collection = key_for_collection&.to_sym end |
#root_key! ⇒ Object
Set root key to true
432 433 434 435 |
# File 'lib/alba/resource.rb', line 432 def root_key! @_key = true @_key_for_collection = true end |
#root_key_for_collection(key) ⇒ Object
Set root key for collection
426 427 428 429 |
# File 'lib/alba/resource.rb', line 426 def root_key_for_collection(key) @_key = true @_key_for_collection = key.to_sym end |
#transform_keys(type, root: true, cascade: true) ⇒ Object
Transform keys as specified type
457 458 459 460 461 462 463 464 465 466 467 |
# File 'lib/alba/resource.rb', line 457 def transform_keys(type, root: true, cascade: true) type = type.to_sym unless %i[none snake camel lower_camel dash].include?(type) # This should be `ArgumentError` but for backward compatibility it raises `Alba::Error` raise ::Alba::Error, "Unknown transform type: #{type}. Supported type are :camel, :lower_camel and :dash." end @_transform_type = type @_transforming_root_key = root @_key_transformation_cascade = cascade end |
#transform_keys!(type) ⇒ Object
Transform keys as specified type AFTER the class is defined Note that this is an experimental API and may be removed/changed
473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 |
# File 'lib/alba/resource.rb', line 473 def transform_keys!(type) dup.class_eval do transform_keys(type, root: @_transforming_root_key, cascade: @_key_transformation_cascade) if @_key_transformation_cascade # We need to update key transformation of associations and nested attributes @_attributes.each_value do |attr| next unless attr.is_a?(Association) || attr.is_a?(NestedAttribute) attr.key_transformation = type end end self # Return the new class end end |