# Создание и использование UI компонент
**ВАЖНО**. *Только для компонент, структура (дерево) которых была создана с помощью [хелпера `define_component`](Хелпер-define_component.md) доступно использование [BEMHTML шаблонов](Шаблоны.md).*
Для всех примеров используется следующая файловая структура:
```
app/
├── assets/
| ├── javascripts/
| | └── application.js
| └── stylesheets/
| └── application.css
├── bemer_components/
| ├── panel/
| | ├── index.html.slim
| | ├── index.js
| | └── index.css
| └── ...
└── ...
```
Подключение технологий JavaScript и CSS компонента `panel` при использование Sprockets:
```js
// Файл app/assets/javascripts/application.js
//= require panel
```
```scss
// Файл app/assets/stylesheets/application.css
//= require panel
```
В качестве структуры компонента `panel` будет взят [компонент `panel` из библиотеки Twitter Bootstrap](https://getbootstrap.com/docs/3.3/components/#panels):
```html
Panel title
Panel content
```
## Компонент без использования шаблонизатора
```html
Panel title
Panel content
```
получение HTML кода компонента в представлениях и/или хелперах:
```slim
/ Шаблонизатор Slim
= render_component :panel
/ =>
/
/
/
Panel title
/
/
Panel content
/
/
```
## Компонент с использованием шаблонизатора
```slim
/ Содержимое файла index.html.slim компонента panel
.panel.panel-default
.panel-heading
h3.panel-title Panel title
.panel-body Panel content
.panel-footer Panel footer
```
получение HTML кода компонента в представлениях и/или хелперах:
```slim
/ Шаблонизатор Slim
= render_component :panel
/ =>
/
/
/
Panel title
/
/
Panel content
/
/
```
## Компонент с помощью `block_tag`
```slim
/ Содержимое файла index.html.slim компонента panel
= block_tag :panel, bem_cascade: false, tag: :div, cls: 'panel panel-default' do |panel|
= panel.elem :heading, tag: :div, cls: 'panel-heading'
= panel.elem :title, tag: :h3, cls: 'panel-title', content: 'Panel title'
= panel.elem :body, tag: :div, cls: 'panel-body', content: 'Panel content'
= panel.elem :footer, tag: :div, cls: 'panel-footer', content: 'Panel footer'
```
получение HTML кода компонента в представлениях и/или хелперах:
```slim
/ Шаблонизатор Slim
= render_component :panel
/ =>
/
/
/
Panel title
/
/
Panel content
/
/
```
## Компонент с помощью `define_component`
**ВАЖНО**. *Доступно использование [BEMHTML шаблонов](Шаблоны.md).*
```slim
/ Содержимое файла index.html.slim компонента panel
= define_component bem_cascade: false, tag: :div do |component|
= component.block :panel, cls: 'panel panel-default' do |panel|
= panel.elem :heading, cls: 'panel-heading'
= panel.elem :title, tag: :h3, cls: 'panel-title', content: 'Panel title'
= panel.elem :body, cls: 'panel-body', content: 'Panel content'
= panel.elem :footer, cls: 'panel-footer', content: 'Panel footer'
```
получение HTML кода компонента в представлениях и/или хелперах:
```slim
/ Шаблонизатор Slim
= render_component :panel
/ =>
/
/
/
Panel title
/
/
Panel content
/
/
```
## Передача локальных переменных в индексный файл технологии HTML
```slim
/ Содержимое файла index.html.slim компонента panel
.panel.panel-default
.panel-heading
h3.panel-title = local_assigns.fetch(:title, 'Default title')
.panel-body = local_assigns.fetch(:content, 'Default content')
.panel-footer = local_assigns.fetch(:footer, 'Default footer')
```
получение HTML кода компонента в представлениях и/или хелперах:
```slim
/ Шаблонизатор Slim
= render_component :panel, title: 'Title', content: 'Content', footer: 'Footer'
/ =>
/
/
/
Title
/
/
Content
/
/
```