在Rails 4.0中,我有game
,game_item
(查找表)和item
之间的多对多关系。如何在创建新游戏时初始化与现有项目的默认关系?
game.rb:
class Game < ActiveRecord::Base
has_many :game_items
has_many :items, :through => :game_items
accepts_nested_attributes_for :game_items
end
game_item.rb:
class GameItem < ActiveRecord::Base
belongs_to :game
belongs_to :item
accepts_nested_attributes_for :item
end
item.rb的:
class Item < ActiveRecord::Base
has_many :game_items
has_many :games, :through => :game_items
end
项目已存在于数据库中,无需创建,但需要更新。在创建新的Game对象时,我想将几个Items与它关联起来。
games_controller.rb:
# GET /games/new
def new
@game = Game.new
@game.items = Item.all(:order => 'RANDOM()', :limit => 3)
end
这似乎有效,因为我在games/new.html.erb
中使用以下代码查看它们:
<p>
<% @game.items.each do |item| %>
<%= item.name %>
<%end %>
</p>
问题在于,通过GameController #create方法保存游戏时,关系不会保存到查找表game_items
中。
# POST /games
# POST /games.json
def create
@game = Game.new(game_params)
respond_to do |format|
if @game.save
format.html { redirect_to @game, notice: 'Game was successfully created.' }
format.json { render action: 'show', status: :created, location: @game }
else
format.html { render action: 'new' }
format.json { render json: @game.errors, status: :unprocessable_entity }
end
end
end
我相信这是强大的参数,不允许保存关系,尽管
# Never trust parameters from the scary internet, only allow the white list through.
def game_params
#params.require(:game).permit( :correct, :incorrect, :timed_out, item_attributes: [:id, :name])[] )
params.require(:game).permit( :correct, :incorrect, :timed_out, :item_ids => [])
end
我知道我可以使用
在create
中再次建立关系
# POST /games
# POST /games.json
def create
@game = Game.new(game_params)
@game.items = Item.all(:order => 'RANDOM()', :limit => 3)
...
但由于这些项是随机的,我需要保存在用户首次使用game
方法启动new
对象时呈现给用户的项目。
如何保存game_item
关系?
编辑:
@phoet建议的解决方案。使用隐藏字段传递数组。
<% @game.items.each do |item| %>
<%= f.hidden_field :item_ids, :multiple => true, :value => item.id %>
<% end %>
答案 0 :(得分:1)
您使用名为item_ids[]
的隐藏字段,并将项目数组分配给它。