Я общая функция управления, который я хотел бы быть повторно использованы между контроллерами:Где поставить общий код контроллера
def render_unprocessable_entity(conn, changeset) do
conn
|> put_status(:unprocessable_entity)
|> render(ExampleApp.ChangesetView, "error.json", changeset: changeset)
end
Вопрос: где я могу поставить это? Я попытался поместить его в контроллеры/помощники/controller_helper.ex, и он говорит: undefined function put_status/2
. Я не могу просто добавить use ExampleApp.Web, :controller
в этот помощник, потому что он будет конфликтовать с существующим контроллером. Я мог бы использовать его как обычный модуль и использовать псевдоним, но это больше набирает ControllerHelper
везде.
Возможно, я могу поместить его в web.ex? Но, может быть, я не должен делать этот файл слишком большим?
Каков наилучший способ СУБДАТЬ код?
Извините, я не уточнил достаточно. Но я хотел использовать эту функцию в своем контроллере, но поместил ее в отдельный модуль, чтобы его можно было импортировать/использовать в других модулях. Я искал что-то вроде рубинового модуля в elixir, где вспомогательный модуль может иметь доступ ко всем существующим функциям, определенным в любом классе, включенном в модуль. Например, методы 'has_many' или' attribute' также могут использоваться в этих модулях. – randomor
Если вы хотите получить доступ из одного модуля ко всем тем, кто его использует, вы можете переопределить ['__using__'] (http://elixir-lang.org/docs/stable/elixir/Kernel.html#use/2) callback для импорта модуля, который вызывает 'use Helper'. – mudasobwa
Бинго! Я думаю, это именно то, что мне нужно. Я закончил с использованием '' 'defmodule ExampleApp.ControllerHelper сделать defmacro __using __ (ОПТС) делать цитаты делать defp render_unprocessable_entity (Conn, ревизия) у сопп |> put_status (: unprocessable_entity) |> Render (ExampleApp.ChangesetView , "error.json", changeet: changeset) конец конец конец конец '' 'вы бы добавили это в свой ответ, прежде чем я приму свой ответ? – randomor