如何定义端点?

时间:2018-03-22 03:01:29

标签: ruby-on-rails rest activerecord rails-activerecord restful-architecture

在我的API中,我希望端点提供主题帐户的ID,并让它返回与主题相关的其他帐户记录。我的模型如下:

这是我的主要帐户模型。受试者和同事都属于帐户类型:

class TabAccount < ApplicationRecord    
  has_many :subjects, through: :subject_tab_account_relationships, source: :subject
  has_many :subject_tab_account_relationships, foreign_key: :id_associate, class_name: "TabAccount"

  has_many :associates, through: :associate_tab_account_relationships, source: :associate
  has_many :associate_tab_account_relationships, foreign_key: :id_subject, class_name: "TabAccount"
end

这是我的帐户关系模型。这提供了主体和同事之间的多对多自我联接关系:

class TabAccountRelation < ApplicationRecord
  belongs_to :ref_relationship_type

  belongs_to :subject, foreign_key: "id_subject", class_name: "TabAccount"
  belongs_to :associate, foreign_key: "id_associate", class_name: "TabAccount"
end

我知道这很有效,因为我能够在我的Rails代码中使用该模型,但我并不完全确定如何通过端点公开这种关系。我知道在路线图文件中您应该将子资源添加到父资源,但我不确定在这种情况下孩子是什么。这是我到目前为止的路线映射:

resources :tab_accounts do
  resources :associates
end

这是我的帐户管理员:

# GET /tab_accounts/:id_subject/associates
# GET /tab_accounts/:id_subject/associates.json
def index
  if params[:id_subject]
    _limit = if params[:limit].present? then params[:limit] else 100 end
    @tab_accounts = TabAccount.find(params[:id_subject]).associates.limit(_limit)
  else
    @tab_accounts = TabAccount.offset(params[:offset]).limit(_limit)
  end
end

这是我对stderr的输出:

Started GET "/tab_accounts/2646/associates.json?limit=5" for 127.0.0.1 at 2018-03-21 22:51:54 -0400
ActionController::RoutingError (uninitialized constant AssociatesController):

之前有没有人通过端点暴露别名/来源?你是怎么做到的?我接近做对了吗?

1 个答案:

答案 0 :(得分:1)

您可以向现有资源添加其他路由,而不是添加嵌套资源。请参阅http://guides.rubyonrails.org/routing.html#adding-more-restful-actions

所以不要使用它:

resources :tab_accounts do
  resources :associates
end

你可以切换到这个:

resources :tab_accounts do
  member do
    get :associates
  end
end

然后,您可以将相应的associates操作添加到现有的帐户控制器中。