Rails 最佳 API 设计以获取与特定用户关联的所有记录
Rails Best API design to get all of a record associated with a certain user
这主要是一个 api 设计问题。我有一个 Rails api,它有用户路线和学校路线。我想从我的前端应用程序调用 api 参数为 UserId,returns 所有与该用户关联的学校。
最好的方法是什么?我应该在 UsersController 中创建一个名为 user-schools 的新路由吗?或者 SchoolsController 中的一条新路线叫做 schools-user?或者创建一个名为 user-schools 的全新控制器?感谢您的指导!
PS:从控制器中的ActiveRecord 获取记录不是问题。问题是如何最好地设计这个 api.
RESTful 的定义方式是通过 nested route:
GET /users/:user_id/schools
相同的基本设计原则适用于 API 和“经典”应用程序。
您可以通过嵌套调用资源宏来定义它:
resources :users do
resources :schools, only: [:index]
end
这会将 /users/:user_id/schools
路由到 SchoolsController#index
。虽然您可以“嗅探” user_id
参数:
class SchoolsController
# GET /schools
# GET /users/1/schools
def index
schools = if params[:user_id].present?
user = User.find(params[:user_id])
user.schools
else
School.all
end
render json: schools
end
end
更简洁的设计是为嵌套上下文使用单独的控制器:
resources :users do
resources :schools, only: [:index], module: :users
end
module Users
class SchoolsController < ApplicationController
# GET /users/1/schools
def index
user = User.find(params[:user_id])
render json: user.schools
end
end
end
这个控制器只做一个工作。您也可以将其命名为 UserSchoolsController
,但将您的控制器拆分到文件夹(和命名空间)中可以更轻松地组织它们。
这主要是一个 api 设计问题。我有一个 Rails api,它有用户路线和学校路线。我想从我的前端应用程序调用 api 参数为 UserId,returns 所有与该用户关联的学校。
最好的方法是什么?我应该在 UsersController 中创建一个名为 user-schools 的新路由吗?或者 SchoolsController 中的一条新路线叫做 schools-user?或者创建一个名为 user-schools 的全新控制器?感谢您的指导!
PS:从控制器中的ActiveRecord 获取记录不是问题。问题是如何最好地设计这个 api.
RESTful 的定义方式是通过 nested route:
GET /users/:user_id/schools
相同的基本设计原则适用于 API 和“经典”应用程序。
您可以通过嵌套调用资源宏来定义它:
resources :users do
resources :schools, only: [:index]
end
这会将 /users/:user_id/schools
路由到 SchoolsController#index
。虽然您可以“嗅探” user_id
参数:
class SchoolsController
# GET /schools
# GET /users/1/schools
def index
schools = if params[:user_id].present?
user = User.find(params[:user_id])
user.schools
else
School.all
end
render json: schools
end
end
更简洁的设计是为嵌套上下文使用单独的控制器:
resources :users do
resources :schools, only: [:index], module: :users
end
module Users
class SchoolsController < ApplicationController
# GET /users/1/schools
def index
user = User.find(params[:user_id])
render json: user.schools
end
end
end
这个控制器只做一个工作。您也可以将其命名为 UserSchoolsController
,但将您的控制器拆分到文件夹(和命名空间)中可以更轻松地组织它们。