web-dev-qa-db-ja.com

フェニックスでカスタムルートを定義する方法はありますか?

いくつかのカスタムアクションを追加してresourcesを作成したいとします。Railsのアナログは次のとおりです。

resources :tasks do
  member do
    get :implement
  end
end

これにより、7つの標準ルートだけでなく、1つの新しいルートが返されます。

GET /tasks/:id/implement

フェニックスでどうすればいいですか?

18
asiniy

Dogbertの答えを少し改善したい:

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

唯一の追加は、ルートの最後のas: :implementです。

したがって、醜いtask_implement_pathではなくtask_task_pathという名前のルートを取得します。

25
denis.peplin

getdoブロック内に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
17
Dogbert

別の解決策は次のとおりです。

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

implementアクションにはmemberルートがあり、doneアクションにはcollectionルートがあります。

この関数呼び出しで前者のパスを取得できます。

tasks_path(@conn, :implement, task)

resourcesafterscopeブロックを配置する必要があることに注意してください。それ以外の場合、Phoenixは/tasks/doneshowアクションのパスとして認識します。

11
Tsutomu