Class: Alchemy::Ingredient

Inherits:
BaseRecord
  • Object
show all
Defined in:
app/models/alchemy/ingredient.rb

Defined Under Namespace

Classes: DefinitionError

Constant Summary

Constants included from SearchableResource

SearchableResource::SEARCHABLE_COLUMN_TYPES

Class Method Summary collapse

Instance Method Summary collapse

Methods included from ConfigMissing

#const_missing

Methods included from SearchableResource

#ransackable_associations, #ransackable_attributes, #ransackable_scopes, #ransortable_attributes

Class Method Details

.allow_settings(settings) ⇒ Object

Allow to define settings on the ingredient definition



85
86
87
# File 'app/models/alchemy/ingredient.rb', line 85

def allow_settings(settings)
  @allowed_settings = Array(settings)
end

.allowed_settingsObject

Allowed settings on the ingredient



90
91
92
# File 'app/models/alchemy/ingredient.rb', line 90

def allowed_settings
  @allowed_settings ||= []
end

.normalize_type(ingredient_type) ⇒ String

Modulize ingredient type

Makes sure the passed ingredient type is in the Alchemy::Ingredients module namespace.

If you add custom ingredient class, put them in the Alchemy::Ingredients module namespace

Parameters:

  • Ingredient (String)

    class name

Returns:

  • (String)


72
73
74
# File 'app/models/alchemy/ingredient.rb', line 72

def normalize_type(ingredient_type)
  "Alchemy::Ingredients::#{ingredient_type.to_s.classify.demodulize}"
end

Defines getter and setter method aliases for related object

Parameters:

  • The (String|Symbol)

    name of the alias

  • The (String)

    class name of the related object



48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'app/models/alchemy/ingredient.rb', line 48

def related_object_alias(name, class_name:)
  alias_method name, :related_object
  alias_method :"#{name}=", :related_object=

  # Somehow Rails STI does not allow us to use `alias_method` for the related_object_id
  define_method :"#{name}_id" do
    related_object_id
  end

  define_method :"#{name}_id=" do |id|
    self.related_object_id = id
    self.related_object_type = id.nil? ? nil : class_name
  end
end

.translated_label_for(role, element_name = nil) ⇒ Object



76
77
78
79
80
81
82
# File 'app/models/alchemy/ingredient.rb', line 76

def translated_label_for(role, element_name = nil)
  Alchemy.t(
    role,
    scope: "ingredient_roles.#{element_name}",
    default: Alchemy.t("ingredient_roles.#{role}", default: role.humanize)
  )
end

Instance Method Details

#as_view_component(options: {}, html_options: {}) ⇒ Object

The view component of the ingredient with mapped options.

Parameters:

  • options (Hash) (defaults to: {})
    • Passed to the view component as keyword arguments

  • html_options (Hash) (defaults to: {})
    • Passed to the view component



153
154
155
# File 'app/models/alchemy/ingredient.rb', line 153

def as_view_component(options: {}, html_options: {})
  view_component_class.new(self, **options, html_options: html_options)
end

#definitionObject

Definition hash for this ingredient from elements.yml file.



107
108
109
110
111
# File 'app/models/alchemy/ingredient.rb', line 107

def definition
  return IngredientDefinition.new unless element

  element.ingredient_definition_for(role) || IngredientDefinition.new
end

#deprecated?Boolean

Returns:

  • (Boolean)


135
136
137
# File 'app/models/alchemy/ingredient.rb', line 135

def deprecated?
  !!definition.deprecated
end

#has_tinymce?Boolean

Returns:

  • (Boolean)


140
141
142
# File 'app/models/alchemy/ingredient.rb', line 140

def has_tinymce?
  false
end

#has_validations?Boolean

Returns:

  • (Boolean)


130
131
132
# File 'app/models/alchemy/ingredient.rb', line 130

def has_validations?
  definition.validate.any?
end

#partial_nameString

The demodulized underscored class name of the ingredient

Returns:

  • (String)


125
126
127
# File 'app/models/alchemy/ingredient.rb', line 125

def partial_name
  self.class.name.demodulize.underscore
end

#preview_ingredient?Boolean

Returns:

  • (Boolean)


145
146
147
# File 'app/models/alchemy/ingredient.rb', line 145

def preview_ingredient?
  !!definition.as_element_title
end

#preview_text(maxlength = 30) ⇒ Object

The first 30 characters of the value

Used by the Element#preview_text method.

Parameters:

  • max_length (Integer)

    (30)



119
120
121
# File 'app/models/alchemy/ingredient.rb', line 119

def preview_text(maxlength = 30)
  value.to_s[0..maxlength - 1]
end

#settingsObject

Settings for this ingredient from the elements.yml definition.



101
102
103
# File 'app/models/alchemy/ingredient.rb', line 101

def settings
  definition.settings
end

#valueObject

The value or the related object if present



96
97
98
# File 'app/models/alchemy/ingredient.rb', line 96

def value
  related_object || self[:value]
end