Ruby on rails has_和_属于_多个关系的Rails路由

Ruby on rails has_和_属于_多个关系的Rails路由,ruby-on-rails,ruby,ruby-on-rails-4,has-and-belongs-to-many,Ruby On Rails,Ruby,Ruby On Rails 4,Has And Belongs To Many,我正在为一个体育团队开发rails 4 API,在这里我有球员和团队,我在rails路由方面有点困难,有很多关系。我的球员和球队之间的关系如下: class Team < ActiveRecord::Base extend Searchable validates :title, presence: true has_and_belongs_to_many :players end class Player < ActiveRecord::Base extend S

我正在为一个体育团队开发rails 4 API,在这里我有球员和团队,我在rails路由方面有点困难,
有很多关系。我的球员和球队之间的关系如下:

class Team < ActiveRecord::Base
  extend Searchable
  validates :title, presence: true
  has_and_belongs_to_many :players
end

class Player < ActiveRecord::Base
  extend Searchable
  validates :first_name, presence: true
  validates :last_name, presence: true
  has_and_belongs_to_many :teams
end
Rails.application.routes.draw do
  devise_for :users
  namespace :api, defaults: { format: :json },
            constraints: { subdomain: 'api' }, path: '/'  do
    scope module: :v1 do
      resources :users, :only               => [:show, :create, :update, :destroy]
      resources :teams, :only               => [:show, :create, :update, :destroy, :index]
      resources :players, :only             => [:show, :create, :update, :destroy, :index]
      resources :sessions, :only            => [:create, :destroy]
    end
  end
end
允许对球员和团队模型进行CRUD操作。我在想,如果要为现有球队添加一名球员,我的路线需要如下所示:

/teams/:team_id/add_player/
但是我不确定如何在
routes.rb
中声明该路由。所以,有几个问题:

  • 从休息的角度来看,这条路线对人们有意义吗?如果是,我将如何在
    routes.rb中声明此路由
  • 它应该是一个补丁还是一个为球队添加球员的POST方法
  • 谢谢你的帮助

    肖恩

    您需要使用:

    这将路由到您的
    players\u controller
    ,传递
    :team\u id
    参数:

    #app/controllers/players_controller.rb
    class PlayersController < ApplicationController
       def new
          @players = Player.all
       end
    
       def create
          if params[:team_id]
            @team = Team.find params[:team_id]
            @player = Player.find params[:id]
            @team.players << player
          else
            # normal "create" action
          end
       end
    
       def destroy
          if params[:team_id]
              @team = Team.find params[:id]
              @player = Player.find params[:id]
              @team.players.delete player
          end
       end
    end
    
    这将创建以下路由:

    #put      url.com/teams/:team_id/players/:id
    #destroy  url.com/teams/:team_id/players/:id
    
    这将允许您在
    团队
    控制器中使用
    玩家
    方法:

    #app/controllers/teams_controller.rb
    class TeamsController < ApplicationController
       def players
          @team = Team.find params[:team_id]
          @player = Player.find params[:id]
          if request.put?
             @team.players << player
          elsif request.delete?
             @team.players.destroy player
          end
       end
    end
    
    #app/controllers/teams_controller.rb
    类TeamsController<应用程序控制器
    def播放器
    @team=team.find参数[:team_id]
    @player=player.find参数[:id]
    如果请求,放吗?
    
    @team.players您可以这样声明此路线:

    resources :teams, only: [:show, :create, :update, :destroy, :index] do
      put 'add_player', on: :member
    end
    
    它将把路线映射到您的
    TeamsController
    中的
    add\u player
    操作


    从剩下的角度来看,我建议您在
    players#update
    操作中这样做,因为您基本上是在更改玩家记录。

    喜欢您的路线格式!谢谢你的邀请。我尝试了一下,但是我的单元测试失败了,出现了一个
    堆栈级别太深的错误。1) Api::V1::TeamsController放置/修补程序#更新用户已登录将玩家添加到团队失败/错误:放置:添加玩家,{User_id:@User.id,id:@team.id,player_id:@player.id}SystemStackError:堆栈级别太深#/Users/sean.oshea/.rvm/gems由于
    团队
    玩家
    中的序列化,因此出现错误。这有一个公开的问题:谢谢你,尤里。在对序列化程序进行寻址之后,这对我来说非常有效。希望他们能在rails的下一个版本中解决这个问题。谢谢你的建议。我认为这感觉像是一个更新,而不是一个创建或销毁。我用枪猛击了一下。有没有办法使用更新而不是创建和销毁的方法使其工作?我需要指定控制器以及操作,因为我得到错误
    缺少:路由定义上的操作键
    。因此,我最终通过:[:放置,:删除]
    #put      url.com/teams/:team_id/players/:id
    #destroy  url.com/teams/:team_id/players/:id
    
    #app/controllers/teams_controller.rb
    class TeamsController < ApplicationController
       def players
          @team = Team.find params[:team_id]
          @player = Player.find params[:id]
          if request.put?
             @team.players << player
          elsif request.delete?
             @team.players.destroy player
          end
       end
    end
    
    resources :teams, only: [:show, :create, :update, :destroy, :index] do
      put 'add_player', on: :member
    end