【发布时间】:2014-06-12 11:37:14
【问题描述】:
所以我必须遵循模型。
class Team < ActiveRecord::Base
belongs_to :user
has_and_belongs_to_many :players
accepts_nested_attributes_for :players
end
class Player < ActiveRecord::Base
has_many :statistics
has_and_belongs_to_many :teams
end
我希望建立一个有球员的团队,这些将由用户选择。通过执行以下操作,我可以在控制台中完美地做到这一点。
@user = User.find(10)
@team = @user.build_team(name: "MyTeam", points: 0)
#<Team team_id: nil, name: "MyTeam", points: 0, user_id: 10>
@team.players.build(name: "Messi")
#<Player player_id: nil, name: "Messi", role: nil>
@team.save
但是,由于强大的参数,我真的很难传递参数。这是我的看法
<%= form_for :team do |f| %>
<%= f.label :name %><br />
<%= f.text_field :name %>
<%= f.fields_for :players do |players| %>
<%= players.label :player_name %>
<%= players.text_field :name %>
<% end %>
<div><%= f.submit "Create Team" %></div>
<% end %>
我想使用团队参数构建团队,使用玩家参数来构建玩家,但是我不知道如何在控制器中实现这一点。
class TeamController < ApplicationController
before_action :authenticate_user!
def new
end
def create
@user = User.find(current_user.id)
@team = @user.build_team(team_params) #Just the team paramaters
@team = @team.players.build(player_params)# I want just the player params
@team.save
end
private
# I can add the player param as nested i.e. .permit(:name, :players => [:name])
# but then build_team complains about receiving an array.
def team_params
params.require(:team).permit(:name)
end
end
欢迎任何解决方案,以及任何改进。
编辑 - 添加架构
create_table "players", primary_key: "player_id", force: true do |t|
t.string "name", limit: 50, null: false
t.string "role", limit: 30, null: false
end
create_table "players_teams", id: false, force: true do |t|
t.integer "player_id", null: false
t.integer "team_id", null: false
end
# players_teams is a Composite Primary Key, as instructed in the guides;
# also essential for targeting.
create_table "teams", primary_key: "team_id", force: true do |t|
t.string "name", limit: 200, null: false
t.integer "points", default: 0, null: false
t.integer "user_id", null: false
end
编辑 2
由于尚未回答此问题,我将添加更多关于我正在尝试的解释。
用户有一个团队,我可以建立团队并建立关系,这要归功于 ActiveRecord。然后用户团队有很多玩家,玩家有很多团队,当我尝试建立这种关系时,玩家表永远不会改变,也不会创建任何关系。
我觉得我应该再次强调,以下内容在 Rails 控制台中完美运行
@user = User.find(10)
@team = @user.build_team(name: "MyTeam", points: 0)
#<Team team_id: nil, name: "MyTeam", points: 0, user_id: 10>
@team.players.build(name: "Messi")
#<Player player_id: nil, name: "Messi", role: nil>
@team.save
团队设置为接受嵌套参数,所以我认为这可行。
@team = @user.build_team(team_params)
def team_params
params.require(:team).permit(:name, players_attributes: [:name, :role])
end
我相信这应该建立玩家模型并建立关系,但是从来没有插入过任何玩家,也没有建立关系。
【问题讨论】:
-
你能分享来自
schema.rb的teams和players表的架构吗?将其添加到问题中。
标签: ruby-on-rails ruby database activerecord