Есть ли способ определить пользовательские маршруты в Финиксе?

Скажем, я хочу создать resources с добавлением к нему нескольких настраиваемых действий, аналог в рельсах:

resources :tasks do
  member do
    get :implement
  end
end

Который вернет мне не только 7 стандартных маршрутов, но 1 новый:

GET /tasks/:id/implement

Как я могу сделать это в phoenix?

Ответ 1

Я хочу улучшить Dogbert немного:

resources "/tasks", TaskController do
  get "/implement", TaskController, :implement, as: :implement
end

Единственное дополнение - as: :implement в конце маршрута.

Таким образом, вы получите маршрут с именем task_implement_path вместо уродливого task_task_path.

Ответ 2

Вы можете добавить get в блок do resources.

Web/router.ex

resources "/tasks", TaskController do
  get "/implement", TaskController, :implement
end

$ mix phoenix.routes

     task_path  GET     /tasks                     MyApp.TaskController :index
     task_path  GET     /tasks/:id/edit            MyApp.TaskController :edit
     task_path  GET     /tasks/new                 MyApp.TaskController :new
     task_path  GET     /tasks/:id                 MyApp.TaskController :show
     task_path  POST    /tasks                     MyApp.TaskController :create
     task_path  PATCH   /tasks/:id                 MyApp.TaskController :update
                PUT     /tasks/:id                 MyApp.TaskController :update
     task_path  DELETE  /tasks/:id                 MyApp.TaskController :delete
task_task_path  GET     /tasks/:task_id/implement  MyApp.TaskController :implement

Ответ 3

Вот еще одно решение:

scope "/tasks" do
  get "/:id/implement", TasksController, :implement
  get "/done", TasksController, :done
end
resources "/tasks", TasksController

Действие implement имеет маршрут участника, а действие done имеет маршрут сбора.

Вы можете получить путь для первого с помощью этого вызова функции:

tasks_path(@conn, :implement, task)

Обратите внимание, что вы должны поместить строку resources после блока scope. В противном случае Phoenix распознает /tasks/done как путь для действия show.

Ответ 4

Похоже, что маршрут сбора должен быть:

get "tasks/implement", Tasks, :implement # collection route

Я не думаю, что у phoenix есть маршруты ресурсов для членов/коллекций, такие как rails.

Я нашел эту ссылку: они немного рассказывают о маршрутах сбора и приводят пример, подобный тому, который я включил выше:

https://github.com/phoenixframework/phoenix/issues/10