Передача идентификатора / объекта с одной страницы / контекста на другую в Phoenix 1.4 - PullRequest
0 голосов
/ 18 октября 2019

У меня есть страница событий, которая представляет собой список, и я хочу, чтобы пользователь щелкнул конкретное событие, чтобы создать запрос на приглашение. Я хочу, чтобы запрос был привязан к этому событию, и чтобы данные события (имя, местоположение и т. Д.) Отображались на странице новой формы запроса. События - это один тип «объекта», а запросы - это другой. Одно событие может иметь много запросов, но не другим способом (таким образом, один ко многим). Я могу создать отношение has_many / own_to, если это улучшит ситуацию, или я могу просто указать event_id в запросах - у меня нет предпочтений. Это проект Phoenix 1.4, ничего особенного или нестандартного, поддерживаемый базой данных PostgreSQL.

Что я не могу понять, так это как передать Событие или event_id в форму New Request. Почти все в инфраструктуре Phoenix действительно великолепно, но я не могу найти правильный способ сделать эту простую вещь.

То, что у меня есть сейчас, более или менее основано на основных руководствах:

project / lib / project_web / templates / tms / event / index.html.eex (список событий)

 <table><tbody><tr><td><%= link event.title, to: Routes.tms_request_path(@conn, :new) %></td></tr></tbody></table>

Это относится к lib / project_web / controllers / request_controller.ex (controller)

def new(conn, _params) do
    changeset = TMS.change_request(%Request{})
    render(conn, “new.html”, changeset: changeset)
end

Это идет в lib / project / tms.ex (контекст)

def change_request(%Request{} = request) do
    Request.changeset(request, %{})
end

Это идет в lib / project / tms / request.ex (схема)

def changeset(request, attrs) do
    request
        |> cast(attrs, [:name, :event_id, :email, :request_count]
        |> validate_required([:name, :event_id, :email, :request_count]

lib / project_web / tms / request / new.html - это форма с полями для атрибутов запроса

Сейчас все с этим отлично работает, так как я могу нажать на ссылку в событияхПеречислите и перейдите на страницу формы Новые запросы и можете сохранить запрос. Очевидно, хотя нет идентификатора или ассоциации, установленной таким образом. Очевидно, я хочу сделать это способом Elixir, а не взламывать что-то вместе. Я пробовал несколько разных способов передать event_id, но ни один из них, похоже, не работает, поэтому я знаю, что что-то упустил, но на данный момент я не могу понять, что это такое.

1 Ответ

1 голос
/ 22 октября 2019

Идентификатор события может быть передан через параметры как:

Routes.request_path(@conn, :new, event_id: event.id) # not tms_request_path

И получен в lib / project_web / controllers / request_controller.ex как параметр event_id в новой функции:

def new(conn %{"event_id" => event_id}) do
  # the even_id can be passed directly to new form
  render(conn, “new.html”, event_id: event_id) 
end

Затем вы можете получить event_id в новой форме в виде параметра @event_id

...