Class: Alchemy::Ingredient

Inherits:
BaseRecord
  • Object
show all
Includes:
Hints
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 Hints

#hint

Methods included from SearchableResource

#ransackable_associations, #ransackable_attributes, #ransortable_attributes

Class Method Details

.allow_settings(settings) ⇒ Object

Allow to define settings on the ingredient definition



83
84
85
# File 'app/models/alchemy/ingredient.rb', line 83

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

.allowed_settingsObject

Allowed settings on the ingredient



88
89
90
# File 'app/models/alchemy/ingredient.rb', line 88

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)


70
71
72
# File 'app/models/alchemy/ingredient.rb', line 70

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



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

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 = class_name
  end
end

.translated_label_for(role, element_name = nil) ⇒ Object



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

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



162
163
164
# File 'app/models/alchemy/ingredient.rb', line 162

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.



105
106
107
108
109
# File 'app/models/alchemy/ingredient.rb', line 105

def definition
  return {} unless element

  element.ingredient_definition_for(role) || {}
end

#deprecated?Boolean

Returns:

  • (Boolean)


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

def deprecated?
  !!definition[:deprecated]
end

#has_hint?Boolean

Returns:

  • (Boolean)


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

def has_hint?
  !!definition[:hint]
end

#has_tinymce?Boolean

Returns:

  • (Boolean)


149
150
151
# File 'app/models/alchemy/ingredient.rb', line 149

def has_tinymce?
  false
end

#has_validations?Boolean

Returns:

  • (Boolean)


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

def has_validations?
  !!definition[:validate]
end

#partial_nameString

The demodulized underscored class name of the ingredient

Returns:

  • (String)


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

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

#preview_ingredient?Boolean

Returns:

  • (Boolean)


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

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)



117
118
119
# File 'app/models/alchemy/ingredient.rb', line 117

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

#settingsObject

Settings for this ingredient from the elements.yml definition.



99
100
101
# File 'app/models/alchemy/ingredient.rb', line 99

def settings
  definition[:settings] || {}
end

#to_partial_pathString

The path to the view partial of the ingredient

Returns:

  • (String)


123
124
125
# File 'app/models/alchemy/ingredient.rb', line 123

def to_partial_path
  "alchemy/ingredients/#{partial_name}_view"
end

#valueObject

The value or the related object if present



94
95
96
# File 'app/models/alchemy/ingredient.rb', line 94

def value
  related_object || self[:value]
end