Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+717новых вакансий за сутки·60 871вакансия открыта сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 951
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 391 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python9 224
  • Облачные технологии4 076
  • QA вакансии1 588
  • Android1 322
  • Инженер данных805
  • Продакт-менеджер368

Разработка

  • Backend вакансии1 317
  • iOS1 239
  • AI вакансии608
  • Fullstack вакансии523
  • Frontend вакансии456
  • Mobile вакансии28

По стеку

  • Go5 445
  • Java3 175
  • Kotlin1 119
  • Node.js1 026
  • Rust949
  • .NET666
  • PHP311
  • C#210
  • C++204

DevOps и инфраструктура

  • DevOps вакансии2 713
  • Kubernetes2 308
  • Linux-инфраструктура1 890
  • Terraform / IaC1 406
  • CI/CD842
  • Мониторинг и Observability645
  • SRE226
  • Кибербезопасность84

Аналитика и данные

  • Аналитик данных483
  • Data Scientist469
  • Бизнес-аналитик349
  • Системный аналитик48

Другие направления

  • Проджект-менеджер139
  • UI/UX дизайн71
  • Ручное тестирование14

По регионам

  • Вакансии в США24 791
  • Вакансии в Европе9 439
  • Работа в России2 924
  • Вакансии в Канаде2 178

По формату

  • Удалённые вакансии43 505
  • Релокация в США24 791
  • Гибридная работа3 370
  • Офисная работа2 525

По уровню

  • Senior вакансии20 898
  • Middle вакансии12 438
  • Junior вакансии3 864

Сейчас нанимают

Все компании
  • Wise191 вакансия
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis48 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме Phoenix (Elixir)Все вопросы
Phoenix (Elixir)JuniorТеория

Что такое Phoenix controller и как он взаимодействует с views и templates?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Controller принимает conn и params, вызывает бизнес-логику через контекст и передаёт данные в View через render/3. В Phoenix 1.7+ View — это модуль PostHTML с embed_templates, а шаблоны — HEEx-файлы. Assigns из render доступны в шаблоне через @variable.

Структура контроллера

defmodule MyAppWeb.PostController do
  use MyAppWeb, :controller
  alias MyApp.Blog

  # GET /posts
  def index(conn, _params) do
    posts = Blog.list_posts()
    render(conn, :index, posts: posts)
  end

  # GET /posts/:id
  def show(conn, %{"id" => id}) do
    post = Blog.get_post!(id)
    render(conn, :show, post: post)
  end

  # GET /posts/new
  def new(conn, _params) do
    changeset = Blog.change_post(%Blog.Post{})
    render(conn, :new, changeset: changeset)
  end

  # POST /posts
  def create(conn, %{"post" => post_params}) do
    case Blog.create_post(post_params) do
      {:ok, post} ->
        conn
        |> put_flash(:info, "Post created successfully.")
        |> redirect(to: ~p"/posts/#{post}")

      {:error, %Ecto.Changeset{} = changeset} ->
        render(conn, :new, changeset: changeset)
    end
  end

  # DELETE /posts/:id
  def delete(conn, %{"id" => id}) do
    post = Blog.get_post!(id)
    {:ok, _post} = Blog.delete_post(post)
    conn
    |> put_flash(:info, "Post deleted.")
    |> redirect(to: ~p"/posts")
  end
end

Phoenix Controller: связующее звено между HTTP и бизнес-логикой

Controller в Phoenix — это Elixir-модуль, который принимает входящий HTTP-запрос через %Plug.Conn{}, вызывает нужную бизнес-логику и передаёт данные в View для формирования ответа. Каждое публичное действие контроллера — это функция, принимающая conn и params.

View и Templates в Phoenix 1.7+

Начиная с Phoenix 1.7 архитектура View изменилась: вместо отдельного модуля PostView используются функциональные компоненты в файле post_html.ex и HEEx-шаблоны:

# lib/my_app_web/controllers/post_html.ex
defmodule MyAppWeb.PostHTML do
  use MyAppWeb, :html

  embed_templates "post_html/*"

  # Компонент для отдельного поста
  attr :post, MyApp.Blog.Post, required: true
  def post_card(assigns) do
    ~H"""
    <div class="post-card">
      <h2><%= @post.title %></h2>
      <p><%= @post.body %></p>
    </div>
    """
  end
end
# lib/my_app_web/controllers/post_html/index.html.heex
<h1>All Posts</h1>
<%= for post <- @posts do %>
  <.post_card post={post} />
<% end %>

Передача данных: controller -> view -> template

Функция render/3 принимает conn, атом-шаблон и keyword list с assigns. Все переданные значения доступны в шаблоне через @variable:

# В контроллере
render(conn, :show, post: post, comments: comments, current_user: conn.assigns.current_user)

# В шаблоне show.html.heex
<h1><%= @post.title %></h1>
<p>By: <%= @current_user.name %></p>
<%= for comment <- @comments do %>
  <p><%= comment.body %></p>
<% end %>

JSON-ответы для API

def show(conn, %{"id" => id}) do
  post = Blog.get_post!(id)
  render(conn, :show, post: post)
end

# post_json.ex
defmodule MyAppWeb.PostJSON do
  def show(%{post: post}) do
    %{data: data(post)}
  end

  defp data(post) do
    %{id: post.id, title: post.title, body: post.body}
  end
end

Роутер связывает URL с actions контроллера

scope "/", MyAppWeb do
  pipe_through :browser
  resources "/posts", PostController, only: [:index, :show, :new, :create, :delete]
end

Подводные камни

  • Логика в контроллере — контроллер должен быть тонким; весь запрос к базе и бизнес-логика должны быть в контексте, не inline в action-функции.
  • Прямой доступ к Repo — вызов Repo.get/2 прямо из контроллера обходит контекстный слой и усложняет тестирование.
  • Разница Phoenix 1.6 и 1.7 — до 1.7 были отдельные View-модули (PostView); в 1.7+ это PostHTML с embed_templates. Смешивание старого и нового стиля ломает render.
  • Assigns недоступны автоматически — чтобы использовать current_user в шаблоне, нужно явно передать его через render/3 или установить в plug через assign/3.
  • put_flash перед redirect — flash должен быть установлен до redirect/2, иначе сообщение не сохранится в сессии.
  • Паттерн-матчинг params — если action ожидает %{"post" => post_params}, но клиент присылает плоский JSON, функция не вызовется (FunctionClauseError).
  • ~p sigil для путей — в Phoenix 1.7 нужно использовать верифицированные маршруты ~p"/posts/#{id}"; старый Routes.post_path(conn, :show, id) устарел.

Частые вопросы на собеседовании

  • Как планировать zero-downtime deploy Phoenix-приложения с Ecto migrations и rolling releases?
  • Что такое Plugs в Phoenix и как работает plug-конвейер?
  • Чем Phoenix отличается от Rails или Django по архитектуре?
  • В чём разница между Phoenix templates (.heex) и традиционными EEx-шаблонами?

Типичные ошибки

  • Сводить controllers views templates к названию метода без lifecycle и failure path.
  • Игнорировать модель runtime: Phoenix 1.8 работает поверх Plug, Endpoint, Router, Controllers/LiveViews, PubSub и OTP supervision.
  • Не отделять validation, authorization, transaction boundary и business logic.

Что проверяет интервьюер

  • Объясняет controllers views templates через конкретную точку lifecycle в Phoenix (Elixir).
  • Приводит корректный минимальный пример без вымышленных методов или callbacks.
  • Называет edge cases: пустые значения, ошибки, транзакции, безопасность или concurrency.

Как вы знаете этот вопрос?

Проверить себя по теме Phoenix (Elixir) →

Источники

  • https://hexdocs.pm/phoenix/controllers.html
  • https://hexdocs.pm/phoenix/
←Предыдущий вопросЧто такое Ecto и каково его отношение к Phoenix?Следующий вопрос→Что такое Phoenix context и как он помогает организовывать бизнес-логику?

Связанные темы

Phoenix (Elixir)Backend-Engineeringphoenix-ecosystem