为 Rails 中的嵌套表单提供另一个模型的字段
Provide another model's fields for nested form in Rails
我有一个 Rails 应用程序,我正在构建它来管理梦幻网球比赛。
这是我的模型。
玩家提交选择的游戏:
class Game < ActiveRecord::Base
belongs_to :user
belongs_to :event
has_many :picks, dependent: :destroy
accepts_nested_attributes_for :picks
我匹配两个网球选手的比赛:
class Match < ActiveRecord::Base
belongs_to :event
belongs_to :player_1, class_name: "Player"
belongs_to :player_2, class_name: "Player"
has_many :picks, dependent: :destroy
选择模型。
class Pick < ActiveRecord::Base
belongs_to :game
belongs_to :match
我正在我正在使用的另一个表单中使用嵌套表单。
<%= form_for(@game) do |f| %>
<% if @game.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@game.errors.count, "error") %> prohibited this game from being saved:</h2>
<ul>
<% @game.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :user_id %><br>
<%= f.collection_select(:user_id, User.all, :id, :name) %>
</div>
<div class="field">
<%= f.label :event_id %><br>
<%= f.collection_select(:event_id, Event.all, :id, :title) %>
</div>
<div class="field">
<%= f.label :score %><br>
<%= f.number_field :score %>
</div>
<% @matches.each do |g| %>
<%= f.fields_for :picks do |ff| %>
<fieldset>
<%= ff.label :match_id %>
<%= ff.text_field :match_id %>
<%= ff.label :winner, "Select the Winner" %>
<%= ff.text_field :winner %>
</fieldset>
<br>
<% end %>
<% end %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
我想使用 Match 模型中的字段来填充 Pick 模型中的字段。例如,比赛有两名球员,我希望能够将球员的名字拉入 :picks 形式,并且可能会对他们使用 f.select 。
我有一些关于 Match 模型的玩家数据,我想将其动态拉入 Pick 模型。无法弄清楚如何查询数据库并获取 Pick 嵌套表单要访问的字段属性。任何帮助,将不胜感激。
这是我要做的。
- 去掉"games"
- 创建 "picks" 模型来存储 "game" 信息
我认为您目前遇到的主要问题是 Game
和 Pick
模型正在尝试做同样的事情。
#app/models/match.rb
class Match < ActiveRecord::Base
# columns id | event_id | name | player_1 | player_2
belongs_to :event
has_many :picks
belongs_to :player_1, class_name: "Player", primary_key: :player_1
belongs_to :player_2, class_name: "Player", primary_key: :player_2
def players
[player_1, player_2]
end
end
#app/models/pick.rb
class Pick < ActiveRecord::Base
# columns id | user_id | match | winner | etc
belongs_to :user
belongs_to :match, primary_key: :match
has_one :winner, primary_key: :winner
end
这意味着您将能够执行以下操作:
#app/views/picks/new.html.erb
<% @matches.each do |match| %>
<%= match.name %>
<%= form_for match.picks.new do |f| %>
<%= f.hidden_field :match, match.id %>
<%= f.collection_select :winner, match.players, :id, :name, prompt: "Who will win?" %>
<%= f.submit %>
<% end %>
<% end %>
#app/controllers/picks_controller.rb
class PicksController < ActionController::Base
def new
@matches = Match.all
end
def create
@pick = Pick.new pick_params
@pick.save
end
private
def pick_params
params.require(:pick).permit(:match, :winner).merge(user_id: current_user)
end
end
这将使您能够以最简单且可扩展的方式 "pick" 播放器。
我有一个 Rails 应用程序,我正在构建它来管理梦幻网球比赛。
这是我的模型。
玩家提交选择的游戏:
class Game < ActiveRecord::Base
belongs_to :user
belongs_to :event
has_many :picks, dependent: :destroy
accepts_nested_attributes_for :picks
我匹配两个网球选手的比赛:
class Match < ActiveRecord::Base
belongs_to :event
belongs_to :player_1, class_name: "Player"
belongs_to :player_2, class_name: "Player"
has_many :picks, dependent: :destroy
选择模型。
class Pick < ActiveRecord::Base
belongs_to :game
belongs_to :match
我正在我正在使用的另一个表单中使用嵌套表单。
<%= form_for(@game) do |f| %>
<% if @game.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@game.errors.count, "error") %> prohibited this game from being saved:</h2>
<ul>
<% @game.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :user_id %><br>
<%= f.collection_select(:user_id, User.all, :id, :name) %>
</div>
<div class="field">
<%= f.label :event_id %><br>
<%= f.collection_select(:event_id, Event.all, :id, :title) %>
</div>
<div class="field">
<%= f.label :score %><br>
<%= f.number_field :score %>
</div>
<% @matches.each do |g| %>
<%= f.fields_for :picks do |ff| %>
<fieldset>
<%= ff.label :match_id %>
<%= ff.text_field :match_id %>
<%= ff.label :winner, "Select the Winner" %>
<%= ff.text_field :winner %>
</fieldset>
<br>
<% end %>
<% end %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
我想使用 Match 模型中的字段来填充 Pick 模型中的字段。例如,比赛有两名球员,我希望能够将球员的名字拉入 :picks 形式,并且可能会对他们使用 f.select 。
我有一些关于 Match 模型的玩家数据,我想将其动态拉入 Pick 模型。无法弄清楚如何查询数据库并获取 Pick 嵌套表单要访问的字段属性。任何帮助,将不胜感激。
这是我要做的。
- 去掉"games"
- 创建 "picks" 模型来存储 "game" 信息
我认为您目前遇到的主要问题是 Game
和 Pick
模型正在尝试做同样的事情。
#app/models/match.rb
class Match < ActiveRecord::Base
# columns id | event_id | name | player_1 | player_2
belongs_to :event
has_many :picks
belongs_to :player_1, class_name: "Player", primary_key: :player_1
belongs_to :player_2, class_name: "Player", primary_key: :player_2
def players
[player_1, player_2]
end
end
#app/models/pick.rb
class Pick < ActiveRecord::Base
# columns id | user_id | match | winner | etc
belongs_to :user
belongs_to :match, primary_key: :match
has_one :winner, primary_key: :winner
end
这意味着您将能够执行以下操作:
#app/views/picks/new.html.erb
<% @matches.each do |match| %>
<%= match.name %>
<%= form_for match.picks.new do |f| %>
<%= f.hidden_field :match, match.id %>
<%= f.collection_select :winner, match.players, :id, :name, prompt: "Who will win?" %>
<%= f.submit %>
<% end %>
<% end %>
#app/controllers/picks_controller.rb
class PicksController < ActionController::Base
def new
@matches = Match.all
end
def create
@pick = Pick.new pick_params
@pick.save
end
private
def pick_params
params.require(:pick).permit(:match, :winner).merge(user_id: current_user)
end
end
这将使您能够以最简单且可扩展的方式 "pick" 播放器。