Ruby on rails has_和_属于_多个关系的Rails路由
我正在为一个体育团队开发rails 4 API,在这里我有球员和团队,我在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
有很多关系。我的球员和球队之间的关系如下:
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