ruby-on-rails - 如何保存记录在rails中有很多关联
问题描述
我正在开发一个rails应用程序,根据要求,我必须实现一个应该添加球员的球队,球员有球队ID和用户ID。如果我将 user_id 和 team_id 保存在玩家中,则意味着将一名玩家添加到特定团队中。我有用户、团队、玩家模型。球队有很多球员。player 模型包含 user_id 和 team id。我很困惑如何在将球员添加到球队时保存记录。我试过
跟随并添加日志。
//playercontoller:
class PlayersController < ApplicationController
def new
@player= Player.new
@team = Team.find(params[:team_id])
@user=User.all
end
def create
@team = Team.find(params[:player][:team_id])
params[:players][:user_id].each do |user_id|
@team.players.create(user_id: user_id)
end
end
private
def player_params
params.require(:player).permit( :team_id,players[:user_id][]
)
end
end
//new.html.erb
<div class="col-md-6 col-md-offset-3">
<div class="container">
<br>
<h3>Add players to team <%= @team.team_name %></h3>
<%= form_for @player do |f| %>
<table>
<tbody>
<%= f.hidden_field :team_id, value: @team.id %>
<tr>
<th>Player Id</th>
<th>Player Name</th>
<th>Select</th>
</tr>
<% @user.each do |x| %>
<tr>
<td><%= x.id %></td>
<td><%= x.full_name %></td>
<td><%= check_box_tag "players[:user_id][]",x.id %></td>
</tr>
<% end %>
<tr>
<td>
<%= f.submit nil, class: 'btn btn-primary' %>
<%= link_to t('.cancel', default:t("helpers.links.cancel")),
root_path, class:'btn btn-default' %>
</td>
</tr>
</tbody>
</table>
<% end %>
</div>
</div>
<%= will_paginate @user,renderer: BootstrapPagination::Rails,previous_label:"old",next_label: "new",inner_window:1,outer_window:1 %>
日志:
Started GET "/" for 127.0.0.1 at 2019-02-27 10:06:36 +0530
(0.3ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
↳ /home/sushmitha/.rvm/gems/ruby-2.5.1/gems/activerecord-5.2.2/lib/active_record/log_subscriber.rb:98
Processing by HomeController#home as HTML
Rendering home/home.html.erb within layouts/application
User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ? [["id", 1], ["LIMIT", 1]]
↳ app/views/home/home.html.erb:3
(0.2ms) SELECT "roles"."name" FROM "roles" INNER JOIN "user_roles" ON "roles"."id" = "user_roles"."role_id" WHERE "user_roles"."user_id" = ? [["user_id", 1]]
↳ app/models/user.rb:31
Rendered home/home.html.erb within layouts/application (50.1ms)
Rendered layouts/_header.html.erb (0.8ms)
Rendered layouts/_footer.html.erb (0.3ms)
Completed 200 OK in 328ms (Views: 310.2ms | ActiveRecord: 4.3ms)
Started GET "/teams/1" for 127.0.0.1 at 2019-02-27 10:06:39 +0530
Processing by TeamsController#show as HTML
Parameters: {"id"=>"1"}
User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ? [["id", 1], ["LIMIT", 1]]
↳ /home/sushmitha/.rvm/gems/ruby-2.5.1/gems/activerecord-5.2.2/lib/active_record/log_subscriber.rb:98
Rendering teams/show.html.erb within layouts/application
Team Load (0.4ms) SELECT "teams".* FROM "teams"
↳ app/views/teams/show.html.erb:3
User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 5], ["LIMIT", 1]]
↳ app/views/teams/show.html.erb:7
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 6], ["LIMIT", 1]]
↳ app/views/teams/show.html.erb:7
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 8], ["LIMIT", 1]]
↳ app/views/teams/show.html.erb:7
User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 4], ["LIMIT", 1]]
↳ app/views/teams/show.html.erb:7
User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 9], ["LIMIT", 1]]
↳ app/views/teams/show.html.erb:7
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 7], ["LIMIT", 1]]
↳ app/views/teams/show.html.erb:7
Rendered teams/show.html.erb within layouts/application (33.7ms)
Rendered layouts/_header.html.erb (0.9ms)
Rendered layouts/_footer.html.erb (0.3ms)
Completed 200 OK in 88ms (Views: 74.4ms | ActiveRecord: 3.7ms)
Started GET "/players/new?team_id=11" for 127.0.0.1 at 2019-02-27 10:06:41 +0530
Processing by PlayersController#new as HTML
Parameters: {"team_id"=>"11"}
User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ? [["id", 1], ["LIMIT", 1]]
↳ /home/sushmitha/.rvm/gems/ruby-2.5.1/gems/activerecord-5.2.2/lib/active_record/log_subscriber.rb:98
Team Load (0.5ms) SELECT "teams".* FROM "teams" WHERE "teams"."id" = ? LIMIT ? [["id", 11], ["LIMIT", 1]]
↳ app/controllers/players_controller.rb:4
Rendering players/new.html.erb within layouts/application
User Load (0.4ms) SELECT "users".* FROM "users" LIMIT ? OFFSET ? [["LIMIT", 2], ["OFFSET", 0]]
↳ app/views/players/new.html.erb:15
(0.2ms) SELECT COUNT(*) FROM "users"
↳ app/views/players/new.html.erb:34
/home/sushmitha/.rvm/gems/ruby-2.5.1/gems/will_paginate-bootstrap-1.0.1/lib/bootstrap_pagination/bootstrap_renderer.rb:11: warning: constant ::Fixnum is deprecated
Rendered players/new.html.erb within layouts/application (35.9ms)
Rendered layouts/_header.html.erb (0.9ms)
Rendered layouts/_footer.html.erb (0.3ms)
Completed 200 OK in 106ms (Views: 83.2ms | ActiveRecord: 2.7ms)
Started POST "/players" for 127.0.0.1 at 2019-02-27 10:06:51 +0530
Processing by PlayersController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"POfJTTsLKDZftZF1J4Rlj0Fc6Z5MxFM3gEhOTc4dv7m4neSK4oo4FTn+pSpuo09bEkAxPYu2ajqDsru/4fJgag==", "player"=>{"team_id"=>"11"}, "players"=>{":user_id"=>["1"]}, "commit"=>"Create Player"}
User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ? [["id", 1], ["LIMIT", 1]]
↳ /home/sushmitha/.rvm/gems/ruby-2.5.1/gems/activerecord-5.2.2/lib/active_record/log_subscriber.rb:98
Team Load (0.2ms) SELECT "teams".* FROM "teams" WHERE "teams"."id" = ? LIMIT ? [["id", 11], ["LIMIT", 1]]
↳ app/controllers/players_controller.rb:14
Completed 500 Internal Server Error in 9ms (ActiveRecord: 0.7ms)
NoMethodError (undefined method `each' for nil:NilClass):
app/controllers/players_controller.rb:15:in `create'
解决方案
在不知道错误的情况下,很难解决问题,但我认为您[]
不需要.each
. 它应该是:
@team = Team.find(params[:player][:team_id])
params[:players][:user_id].each do |user_id|
@team.players.create(user_id: user_id)
end
正确缩进你的代码是很好的,它有助于发现错误和调试。此外,一个表格不能是一个表格的子表格,除非它在一个 th 或 td 之内。浏览器会将表单放在表格之前,但其中的字段因此使表格为空:
<div class="col-md-6 col-md-offset-3">
<div class="container">
<br>
<h3>Add players to team <%= @team.team_name %></h3>
<%= form_for @player do |f| %>
<table>
<tbody>
<%= f.hidden_field :team_id, value: @team.id %>
<tr>
<th>Player Id</th>
<th>Player Name</th>
<th>Select</th>
</tr>
<% @user.each do |x| %>
<tr>
<td><%= x.id %></td>
<td><%= x.full_name %></td>
<td><%= check_box_tag "players[user_id][]",x.id %></td>
</tr>
<% end %>
<tr>
<td>
<%= f.submit nil, class: 'btn btn-primary' %>
<%= link_to t('.cancel', default:t("helpers.links.cancel")),
root_path, class:'btn btn-default' %>
</td>
</tr>
</tbody>
</table>
<% end %>
</div>
</div>
推荐阅读
- javascript - 基于 Javascript 变量值的多个 SVG 动画的设置时间已过
- android - 从 Firebase 获取数据
- c# - 我对在控制器和视图之间多次传递数据感到非常困惑
- android - Ionic3 应用程序无法在三星手机 android 8.0 及更高版本中访问互联网
- google-cloud-platform - 无法从计算解析 Google Cloud DNS 托管私有区域
- php - 如何在不崩溃的情况下使用 php 获取站点信息?
- jquery - 事件.PreventDefault(); 在嵌套的 onClick 函数中不起作用
- c# - 应该使用什么设计模式连接到具有完全相同架构和父/主数据库的多个数据库实例之一?
- c# - 如何从 HTML 表中获取值到 ASP.net C# 代码?
- python - 如何在水平时间检查各个路口的车数?